Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
katish444 Member Откуда: Сообщений: 276 |
Привет всем. Подскажите пожалуйста, как разбить интервал на подынтервалы. К примеру у меня есть интервал от 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] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
katish444, то есть нужно разбить большой интервал на меленькие и значения продублировать от большого интервала |
28 авг 18, 10:53 [21655824] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
katish444, JOIN <Таблица с числами> |
28 авг 18, 10:55 [21655829] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
katish444, развернуть N-интервалов в 2*N-точек начал кончал, после чего, свернуть полученный список точек в новые подынтервальчики... |
28 авг 18, 10:55 [21655831] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
TaPaK, подробнее, пожалуйста. Что с чем джойнить? |
28 авг 18, 10:58 [21655834] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
Щукина Анна, в смысле from-to вынести в разные столбцы для разных значений? А потом? |
28 авг 18, 10:59 [21655835] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
всмысле примерно схематично так: 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] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
Kopelly, спасибо тебе большое Как же у тебя все легко получается! |
28 авг 18, 11:03 [21655841] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
Щукина Анна, здорово. Спасибо большое! такие решения мне еще не раз пригодятся |
28 авг 18, 11:04 [21655843] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
Kopelly, подскажи, пожалуйста, а как теперь туда значения добавить? Если добавляю поля name и value, то теряется разделение подынтервалов |
28 авг 18, 11:29 [21655881] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
Kopelly, посмотри пожалуйста. Он у меня не верно выделяет интервалы и дублирует from-toselect * 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] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
|
||
28 авг 18, 11:37 [21655895] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
Щукина Анна, а по какому критерию их соединять? у них ведь теперь разные интервалы? |
28 авг 18, 11:50 [21655928] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
Щукина Анна, подскажи пожалуйста, как их сджойнить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] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
Kopelly, подскажи пожалуйста как их соединить. Уже полтора часа мучаюсь и ничего не выходит |
28 авг 18, 13:12 [21656068] Ответить | Цитировать Сообщить модератору |
Руслан Дамирович 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] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
katish444, Если исходные «мегаинтервалы» пересекаются, как в вашем примере 0-100, 50-52, то в получившиеся подинтервалы из какого исходного подтягивать остальную информацию? К примеру для вновь полученного интервала 50-52? |
28 авг 18, 17:13 [21656646] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
Щукина Анна, 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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
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] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
Kopelly, подскажи, пожалуйста, а можно ли не просто разбить большой интервал, но и избежать дублирование. То есть когда вставляется маленький интервал, то дублирование основного интервала не происходит То есть зачеркнутых интервалов быть не должно К сообщению приложен файл. Размер - 61Kb |
11 окт 18, 14:02 [21701601] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
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] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
[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 | ![]() |