powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Группировка по "периодам активности"
4 сообщений из 4, страница 1 из 1
Группировка по "периодам активности"
    #39627219
Contrast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго всем времени суток!

Забавная возникла задачка - сгруппировать записи по "периодам активности" клиента.
Период активности - это когда разница между датами в двух соседних записях не более некоторой величины.
Для каждого периода нужно определить начало, конец, количество записей, некоторые агрегаты по разным полям

Например, если в таблице

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create table #t (d date, s int)
insert into #t
values ('20180301', 100)
	,('20180322', 100)
	,('20180303', 100)
	,('20180402', 100)
	,('20180304', 100)
	,('20180327', 100)
	,('20180315', 100)
	,('20180410', 100)
	,('20180320', 100)
go

select *
from #t
order by d
go



считать под некоторой величиной неделю (7 дней), то ожидается вот такой результат
(для простоты здесь один агрегат - сумма)
dStartdEndiCountiSum2018-03-012018-03-0433002018-03-152018-04-0266002018-04-102018-04-101100
количество дней между соседними датами подсчитать просто
Код: sql
1.
2.
3.
4.
5.
select t.d, t.s
	,lag(t.d, 1, t.d) over (order by t.d) prev
	,datediff(day, lag(t.d, 1, t.d) over (order by t.d), t.d) dif
from #t t
go


dsprevdif2018-03-011002018-03-0102018-03-031002018-03-0122018-03-041002018-03-0312018-03-151002018-03-04112018-03-201002018-03-1552018-03-221002018-03-2022018-03-271002018-03-2252018-04-021002018-03-2762018-04-101002018-04-028

Но вот как дальше сгруппировать, что-то не соображу...
Почему-то курсор городить неохота, а другие варианты пока на ум не идут...



Я всегда лгу.
...
Рейтинг: 0 / 0
Группировка по "периодам активности"
    #39627227
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на вскидку:
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
declare @t table (d date, s int)
insert @t
values
  ('20180301', 100)
  ,('20180322', 100)
  ,('20180303', 100)
  ,('20180402', 100)
  ,('20180304', 100)
  ,('20180327', 100)
  ,('20180315', 100)
  ,('20180410', 100)
  ,('20180320', 100)
  ,('20180411', 100)
  ,('20180413', 100)
  ,('20180421', 100)
  ,('20180425', 100)
  ,('20180429', 100)

declare @N tinyint = 7 -- << ваша величина
;
with
  t1 as
  (
  select
    d, s,
    sign(datediff(dd, isnull(lag(d)over(order by d), d), d) / (@N + 1)) as dd
  from
    @t
  ),
  t2 as
  (
  select
    d, s,
    sum(dd)over(order by d rows unbounded preceding) as gr
    from
    t1
  )

select
   d, s, gr
from
  t2
order by
  d
...
Рейтинг: 0 / 0
Группировка по "периодам активности"
    #39627258
Contrast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дедушка!

Спасибо!
Получается
...
Рейтинг: 0 / 0
Группировка по "периодам активности"
    #39627363
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гм, Дедушка, блин, я думал, что это задача на поиск островов, и решается рекурсивным запросом.
Спасибо, попытаюсь вкурить!
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Группировка по "периодам активности"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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