Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Группировка по "периодам активности" / 4 сообщений из 4, страница 1 из 1
08.04.2018, 00:48
    #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
08.04.2018, 02:36
    #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
08.04.2018, 10:00
    #39627258
Contrast
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка по "периодам активности"
Дедушка!

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


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