powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разбить большой интервал на подынтервалы
25 сообщений из 26, страница 1 из 2
Разбить большой интервал на подынтервалы
    #39694138
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем.
Подскажите пожалуйста, как разбить интервал на подынтервалы.
К примеру у меня есть интервал от 0 до 100 и есть от 50 до 52, мне необходимо получить от 0 до 50, от 50 до 52 и от 52 до 100.
Возможно ли такое?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694140
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
katish444,
то есть нужно разбить большой интервал на меленькие и значения продублировать от большого интервала
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694142
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
katish444,

JOIN <Таблица с числами>
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694144
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
katish444,

развернуть N-интервалов в 2*N-точек начал кончал, после чего, свернуть полученный список точек в новые подынтервальчики...
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694146
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK, подробнее, пожалуйста. Что с чем джойнить?
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694147
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна,
в смысле from-to вынести в разные столбцы для разных значений?
А потом?
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694150
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694151
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
katish444Щукина Анна,
в смысле from-to вынести в разные столбцы для разных значений?
А потом?
всмысле примерно схематично так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694152
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopelly, спасибо тебе большое
Как же у тебя все легко получается!
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694154
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна, здорово. Спасибо большое! такие решения мне еще не раз пригодятся
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694176
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopelly, подскажи, пожалуйста, а как теперь туда значения добавить? Если добавляю поля name и value, то теряется разделение подынтервалов
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694181
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopelly, посмотри пожалуйста. Он у меня не верно выделяет интервалы и дублирует from-to
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694182
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
katish444Kopelly, подскажи, пожалуйста, а как теперь туда значения добавить? Если добавляю поля name и value, то теряется разделение подынтерваловjoin же. на исходную версию таблицы...
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694204
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна,
а по какому критерию их соединять? у них ведь теперь разные интервалы?
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694212
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна, подскажи пожалуйста, как их сджойнить
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694276
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopelly, подскажи пожалуйста как их соединить. Уже полтора часа мучаюсь и ничего не выходит
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694492
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
  *
FROM
  geols 
  LEFT JOIN @geodetail geold ON (
        geols.geolfrom BETWEEN geold.geolfrom AND geold.geolto )
WHERE
  geols.geolto is not null
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694495
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
katish444,

Если исходные «мегаинтервалы» пересекаются, как в вашем примере 0-100, 50-52, то в получившиеся подинтервалы из какого исходного подтягивать остальную информацию? К примеру для вновь полученного интервала 50-52?
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694527
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,

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

Пусть исходные интервалы будут такие: 0-100, 50-150.
После разбиения получатся интервалы: 0-50, 50-100, 100-150.
Вот для подынтервальчика 50-100 из какого исходного интервала подтягивать данные?
Из 0-100? или из 50-150? Почему?
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694634
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,
С обоих интервалов - там детализация разная ('HH','GT' и т.д.).

katish444,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39694642
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopelly,
Код: sql
1.
2.
3.
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 дня думала и так и не решила как их джойнить
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39716141
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopelly, подскажи, пожалуйста, а можно ли не просто разбить большой интервал, но и избежать дублирование. То есть когда вставляется маленький интервал, то дублирование основного интервала не происходит

То есть зачеркнутых интервалов быть не должно
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39716441
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так данные-то разные (хоть и на один интервал).
Если нужно оставить первые попавшиеся данные на интервале, тогда:
Код: sql
1.
2.
Select top 1 with ties ...... 
Order by ROW_NUMBER() Over(Partition by geolfrom, geolfrom, holeid, projectcode Order by (Select 1) /*или свой набор для сортировки*/)



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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39716455
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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)
...
Рейтинг: 0 / 0
Разбить большой интервал на подынтервалы
    #39716456
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Kopelly]Так данные-то разные (хоть и на один интервал).
Если нужно оставить первые попавшиеся данные на интервале, тогда:
Код: sql
1.
2.
Select top 1 with ties ...... 
Order by ROW_NUMBER() Over(Partition by geolfrom, geolfrom, holeid, projectcode Order by (Select 1) /*или свой набор для сортировки*/)



Вот! можно эту идею подробнее, немного не поняла. У меня Lith3 всегда начинается с "_%"? но если я указываю это условие, то пропадают Lith1...
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разбить большой интервал на подынтервалы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]