Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Разбить большой интервал на подынтервалы  [new]
katish444
Member

Откуда:
Сообщений: 261
Привет всем.
Подскажите пожалуйста, как разбить интервал на подынтервалы.
К примеру у меня есть интервал от 0 до 100 и есть от 50 до 52, мне необходимо получить от 0 до 50, от 50 до 52 и от 52 до 100.
Возможно ли такое?
declare  @geodetail  table (holeid varchar(255),projectcode varchar(255),geolfrom float, geolto float,[value] varchar(255), name varchar(20))
insert into @geodetail  (holeid,projectcode ,geolfrom, geolto,[value] , name) values ('UZ-001','uz',0,100, 'Lith_RockName','HH')
insert into @geodetail  (holeid,projectcode , geolfrom, geolto, [value] , name) values ('UZ-001','uz',100,200, 'Lith_RockName','GT')
insert into @geodetail  (holeid,projectcode ,geolfrom, geolto,  [value] , name) values ('UZ-001','uz',0,100, 'Lith2_RockName','JH')
insert into @geodetail  (holeid,projectcode , geolfrom, geolto, [value] , name) values ('UZ-001','uz', 100,200,'Lith2_RockName','OO')
insert into @geodetail  (holeid,projectcode , geolfrom, geolto, [value] , name) values ('UZ-001','uz',20,25, 'Lith3_RockName','DR')
insert into @geodetail  (holeid,projectcode ,geolfrom, geolto,  [value] , name) values ('UZ-001','uz',25,36, 'Lith3_RockName','UU')
insert into @geodetail  (holeid,projectcode ,geolfrom, geolto,  [value] , name) values ('UZ-001','uz', 120,130,'Lith3_RockName','GTRR')
select*from @geodetail
28 авг 18, 10:51    [21655821]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
katish444
Member

Откуда:
Сообщений: 261
katish444,
то есть нужно разбить большой интервал на меленькие и значения продублировать от большого интервала
28 авг 18, 10:53    [21655824]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
katish444,

JOIN <Таблица с числами>
28 авг 18, 10:55    [21655829]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
katish444,

развернуть N-интервалов в 2*N-точек начал кончал, после чего, свернуть полученный список точек в новые подынтервальчики...
28 авг 18, 10:55    [21655831]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
katish444
Member

Откуда:
Сообщений: 261
TaPaK, подробнее, пожалуйста. Что с чем джойнить?
28 авг 18, 10:58    [21655834]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
katish444
Member

Откуда:
Сообщений: 261
Щукина Анна,
в смысле from-to вынести в разные столбцы для разных значений?
А потом?
28 авг 18, 10:59    [21655835]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
declare  @geodetail  table (holeid varchar(255),projectcode varchar(255),geolfrom float, geolto float,[value] varchar(255), name varchar(20))
insert into @geodetail  (holeid,projectcode ,geolfrom, geolto,[value] , name) values ('UZ-001','uz',0,100, 'Lith_RockName','HH')
insert into @geodetail  (holeid,projectcode , geolfrom, geolto, [value] , name) values ('UZ-001','uz',100,200, 'Lith_RockName','GT')
insert into @geodetail  (holeid,projectcode ,geolfrom, geolto,  [value] , name) values ('UZ-001','uz',0,100, 'Lith2_RockName','JH')
insert into @geodetail  (holeid,projectcode , geolfrom, geolto, [value] , name) values ('UZ-001','uz', 100,200,'Lith2_RockName','OO')
insert into @geodetail  (holeid,projectcode , geolfrom, geolto, [value] , name) values ('UZ-001','uz',20,25, 'Lith3_RockName','DR')
insert into @geodetail  (holeid,projectcode ,geolfrom, geolto,  [value] , name) values ('UZ-001','uz',25,36, 'Lith3_RockName','UU')
insert into @geodetail  (holeid,projectcode ,geolfrom, geolto,  [value] , name) values ('UZ-001','uz', 120,130,'Lith3_RockName','GTRR')
select*from @geodetail;


With geols_from as 
(Select holeid,projectcode, geolfrom From @geodetail
  union 
 Select holeid,projectcode, geolto From @geodetail),
geols as 
(Select holeid,projectcode, geolfrom, lead(geolfrom) over (Partition by holeid,projectcode order by geolfrom) as Geolto From geols_from)
Select * From geols Where Geolto is not null
28 авг 18, 11:02    [21655839]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
katish444
Щукина Анна,
в смысле from-to вынести в разные столбцы для разных значений?
А потом?

всмысле примерно схематично так:

with
  intervals (b,e) 
    as(
        select * from (values (0, 100), (50,52))v(b,e)
      )
, points (p) 
    as (
         select b from intervals union select e from intervals
       )
select * 
  from (
         select p as new_b, lead(p) over(order by p) as new_e
           from points
       )v
 where new_e is not null
28 авг 18, 11:02    [21655840]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
katish444
Member

Откуда:
Сообщений: 261
Kopelly, спасибо тебе большое
Как же у тебя все легко получается!
28 авг 18, 11:03    [21655841]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
katish444
Member

Откуда:
Сообщений: 261
Щукина Анна, здорово. Спасибо большое! такие решения мне еще не раз пригодятся
28 авг 18, 11:04    [21655843]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
katish444
Member

Откуда:
Сообщений: 261
Kopelly, подскажи, пожалуйста, а как теперь туда значения добавить? Если добавляю поля name и value, то теряется разделение подынтервалов
28 авг 18, 11:29    [21655881]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
katish444
Member

Откуда:
Сообщений: 261
Kopelly, посмотри пожалуйста. Он у меня не верно выделяет интервалы и дублирует from-to
select * from GEODETAILS where (name like 'Lith_RockName' or name like 'Lith2_RockName' or name like 'Lith3_RockName') and holeid like 'dzd%' ;
With geols_from as 
(Select holeid,projectcode,name,value, geolfrom From GEODETAILS
  union 
 Select holeid,projectcode,name,value, geolto From GEODETAILS),
geols as 
(Select holeid,projectcode,name,value, geolfrom, lead(geolfrom) over (Partition by holeid,projectcode order by geolfrom) as Geolto From geols_from)
Select * From geols Where Geolto is not null
and (name like 'Lith%_RockName' ) and holeid like 'dzd%'
order by holeid, GEOLFROM


К сообщению приложен файл. Размер - 107Kb
28 авг 18, 11:36    [21655893]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
katish444
Kopelly, подскажи, пожалуйста, а как теперь туда значения добавить? Если добавляю поля name и value, то теряется разделение подынтервалов
join же. на исходную версию таблицы...
28 авг 18, 11:37    [21655895]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
katish444
Member

Откуда:
Сообщений: 261
Щукина Анна,
а по какому критерию их соединять? у них ведь теперь разные интервалы?
28 авг 18, 11:50    [21655928]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
katish444
Member

Откуда:
Сообщений: 261
Щукина Анна, подскажи пожалуйста, как их сджойнить
declare  @geodetail  table (holeid varchar(255),projectcode varchar(255),geolfrom float, geolto float,[value] varchar(255), name varchar(20))
insert into @geodetail  (holeid,projectcode ,geolfrom, geolto,name , [value]) select holeid, projectcode,geolfrom,geolto,name,value from(select * from GEODETAILS where (name like 'Lith_RockName' or name like 'Lith2_RockName' or name like 'Lith3_RockName') and holeid like 'dzd%' )d 

select*from @geodetail;


With geols_from as 
(Select holeid,projectcode, geolfrom From @geodetail
  union 
 Select holeid,projectcode, geolto From @geodetail),
geols as 
(Select holeid,projectcode, geolfrom, lead(geolfrom) over (Partition by holeid,projectcode order by geolfrom) as Geolto From geols_from)
Select * From geols Where Geolto is not null
28 авг 18, 12:00    [21655943]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
katish444
Member

Откуда:
Сообщений: 261
Kopelly, подскажи пожалуйста как их соединить. Уже полтора часа мучаюсь и ничего не выходит
28 авг 18, 13:12    [21656068]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
SELECT
  *
FROM
  geols 
  LEFT JOIN @geodetail geold ON (
        geols.geolfrom BETWEEN geold.geolfrom AND geold.geolto )
WHERE
  geols.geolto is not null
28 авг 18, 17:01    [21656631]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
katish444,

Если исходные «мегаинтервалы» пересекаются, как в вашем примере 0-100, 50-52, то в получившиеся подинтервалы из какого исходного подтягивать остальную информацию? К примеру для вновь полученного интервала 50-52?
28 авг 18, 17:13    [21656646]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
Щукина Анна,

0-100, 50-52 - не совсем удачный пример.

Пусть исходные интервалы будут такие: 0-100, 50-150.
После разбиения получатся интервалы: 0-50, 50-100, 100-150.
Вот для подынтервальчика 50-100 из какого исходного интервала подтягивать данные?
Из 0-100? или из 50-150? Почему?
28 авг 18, 18:03    [21656724]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Щукина Анна,
С обоих интервалов - там детализация разная ('HH','GT' и т.д.).

katish444,

declare  @geodetail  table (holeid varchar(255),projectcode varchar(255),geolfrom float, geolto float,[value] varchar(255), name varchar(20))
insert into @geodetail  (holeid,projectcode ,geolfrom, geolto,[value] , name) values ('UZ-001','uz',0,100, 'Lith_RockName','HH')
insert into @geodetail  (holeid,projectcode , geolfrom, geolto, [value] , name) values ('UZ-001','uz',100,200, 'Lith_RockName','GT')
insert into @geodetail  (holeid,projectcode ,geolfrom, geolto,  [value] , name) values ('UZ-001','uz',0,100, 'Lith2_RockName','JH')
insert into @geodetail  (holeid,projectcode , geolfrom, geolto, [value] , name) values ('UZ-001','uz', 100,200,'Lith2_RockName','OO')
insert into @geodetail  (holeid,projectcode , geolfrom, geolto, [value] , name) values ('UZ-001','uz',20,25, 'Lith3_RockName','DR')
insert into @geodetail  (holeid,projectcode ,geolfrom, geolto,  [value] , name) values ('UZ-001','uz',25,36, 'Lith3_RockName','UU')
insert into @geodetail  (holeid,projectcode ,geolfrom, geolto,  [value] , name) values ('UZ-001','uz', 120,130,'Lith3_RockName','GTRR')
select*from @geodetail;


With geols_from as 
(Select holeid,projectcode, geolfrom From @geodetail
  union 
 Select holeid,projectcode, geolto From @geodetail),
geols as 
(Select holeid,projectcode, geolfrom, lead(geolfrom) over (Partition by holeid,projectcode order by geolfrom) as Geolto From geols_from)
Select a.GeolFrom, --Новое начало интервала
       a.GeolTo,   --Новый конец интервала
       b.* 
  From geols a 
  join @geodetail b 
    on a.holeid = b.holeid and a.projectcode = b.projectcode
   and a.GeolTo>b.GeolFrom and a.GeolFrom<b.GeolTo
 Where a.Geolto is not null
29 авг 18, 04:58    [21657054]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
katish444
Member

Откуда:
Сообщений: 261
Kopelly,
join @geodetail b 
    on a.holeid = b.holeid and a.projectcode = b.projectcode
   and a.GeolTo>b.GeolFrom and a.GeolFrom<b.GeolTo

спасибо большое, я 1,5 дня думала и так и не решила как их джойнить
29 авг 18, 06:56    [21657070]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
katish444
Member

Откуда:
Сообщений: 261
Kopelly, подскажи, пожалуйста, а можно ли не просто разбить большой интервал, но и избежать дублирование. То есть когда вставляется маленький интервал, то дублирование основного интервала не происходит

То есть зачеркнутых интервалов быть не должно

К сообщению приложен файл. Размер - 61Kb
11 окт 18, 14:02    [21701601]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Так данные-то разные (хоть и на один интервал).
Если нужно оставить первые попавшиеся данные на интервале, тогда:
Select top 1 with ties ...... 
Order by ROW_NUMBER() Over(Partition by geolfrom, geolfrom, holeid, projectcode Order by (Select 1) /*или свой набор для сортировки*/)


Если объединить информацию с интервала:

With geols_from as 
(Select holeid,projectcode, geolfrom From @geodetail
  union 
 Select holeid,projectcode, geolto From @geodetail),
geols as 
(Select holeid,projectcode, geolfrom, lead(geolfrom) over (Partition by holeid,projectcode order by geolfrom) as Geolto From geols_from)
Select a.*,
       stuff((Select ', '+b.value
                From @geodetail b 
               Where a.holeid = b.holeid and a.projectcode = b.projectcode
                 and a.GeolTo>b.GeolFrom and a.GeolFrom<b.GeolTo for xml path('')),1,2,'') as Value
  From geols a 
 Where a.Geolto is not null
12 окт 18, 04:39    [21702098]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
katish444
Member

Откуда:
Сообщений: 261
Kopelly,
прости, я плохо объяснила суть. Геолог описывает керн. У него, допустим от 0 до 200 м полностью известняки с песком (Lith1 + Lith2), но в двух местах есть вкрапленности другой породы (Lith3). Например 120-125 и 185 -189. В целях экономии времени геолога, ему позволяют писать полный интервал 0-200 и в отделенной вкладке указывать Lih3. Но по факту - это от 0 до 120 известняк, потом 120-125 Lith3, потом 125-185 Lith1 ну и так далее. Смысл в том, что при наличии Lith3, этот интервал должен вырезаться из Lith1 (Lith2 я в расчет не беру, т.к. я их в один интервал объединаю concat)
12 окт 18, 06:13    [21702114]     Ответить | Цитировать Сообщить модератору
 Re: Разбить большой интервал на подынтервалы  [new]
katish444
Member

Откуда:
Сообщений: 261
[quot Kopelly]Так данные-то разные (хоть и на один интервал).
Если нужно оставить первые попавшиеся данные на интервале, тогда:
Select top 1 with ties ...... 
Order by ROW_NUMBER() Over(Partition by geolfrom, geolfrom, holeid, projectcode Order by (Select 1) /*или свой набор для сортировки*/)


Вот! можно эту идею подробнее, немного не поняла. У меня Lith3 всегда начинается с "_%"? но если я указываю это условие, то пропадают Lith1...
12 окт 18, 06:17    [21702115]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить