powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Объединение пересекающихся диапазонов дат.
4 сообщений из 29, страница 2 из 2
Объединение пересекающихся диапазонов дат.
    #39807046
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще так извратится:
Код: 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.
with t1 as
(
 select
  a.CI, b.dt, b.flag,
  case when sum(flag) over (partition by a.CI order by b.dt, %%lockres%%) - b.flag = 0 then 1 else 0 end as v
 from
  #SourceData a cross apply
  (values (a.DateTimeStarted, -1), (a.DateTimeCompleted, 1)) b(dt, flag)
),
t2 as
(
 select
  *,
  sum(v) over (partition by CI order by dt) as g
 from
  t1
)
select
 CI, min(dt), max(dt)
from
 t2
group by
 CI, g
order by
 min(dt);
...
Рейтинг: 0 / 0
Объединение пересекающихся диапазонов дат.
    #39807104
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DnRumata,

Если правильно понимаю, как раз ваш случай: ссылка
...
Рейтинг: 0 / 0
Объединение пересекающихся диапазонов дат.
    #39807106
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DnRumata2017-10-01 2017-09-13 - мягко говоря не то.

Шо, страдалец ,рыба не чищеная?
...
Рейтинг: 0 / 0
Объединение пересекающихся диапазонов дат.
    #39807110
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Держи чищеную.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
declare @b table(CI NVARCHAR(10) NOT NULL, DateTimeStarted datetime NOT NULL, n int identity,  primary key(CI , n));
declare @e table(CI NVARCHAR(10) NOT NULL, DateTimeCompleted datetime NOT NULL, n int identity, primary key(CI , n));

with t as ( select *  from @SourceData)
insert @b
  select CI, DateTimeStarted from t where not exists( select * from t as t0 where t0.CI = t.CI and ( t0.DateTimeStarted < t.DateTimeStarted and t.DateTimeStarted <= t0.DateTimeCompleted and t0.n <> t.n ) or (t0.DateTimeStarted = t.DateTimeStarted and t0.n < t.n ) ) order by CI, DateTimeStarted asc

select * from @b;

with t as ( select *  from @SourceData)
insert @e
  select CI, DateTimeCompleted from t where not exists( select * from t as t0 where t0.CI = t.CI and ( t0.DateTimeStarted <= t.DateTimeCompleted and t.DateTimeCompleted < t0.DateTimeCompleted and t0.n <> t.n ) or ( t.DateTimeCompleted = t0.DateTimeCompleted and t0.n > t.n ) ) order by CI, DateTimeCompleted asc

select * from @e;

select b.DateTimeStarted, e.DateTimeCompleted
  from @b as b inner join @e as e on e.CI = b.CI and e.n = b.n



Забавно, конечно, насколько тредстартер беспомощен.
...
Рейтинг: 0 / 0
4 сообщений из 29, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Объединение пересекающихся диапазонов дат.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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