Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Группировка по временному интервалу (1 значение из интервала)  [new]
Dimais
Member

Откуда:
Сообщений: 227
2 invm

так нет же ...

set dateformat ymd

declare @t as table (userid int, dt datetime2(0))

insert into @t select 1,         '2019-07-01 07:00:00'
union select 1,			 '2019-07-01 07:19:15'
union select 1,			 '2019-07-01 07:20:01'
union select 1,			 '2019-07-01 07:40:01'
union select 1,			 '2019-07-01 07:45:15'


;with a as
(
 select
  a.*,
  b.x - lag(b.x, 1, b.x) over (partition by a.userid order by a.dt) as d
 from
  @t a cross apply
  (select datediff(mi, '1900', a.dt)) b(x)
),
b as (select *, sum(d) over (partition by a.userid order by a.dt) % 20 as drt from a),
c as (select userid, dt, case when drt % 20 < lag(drt % 20, 1, drt + 1) over (partition by userid order by dt) then 1 else 0 end as f from b)
select userid, dt from c where f = 1
30 июл 19, 12:23    [21937749]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временному интервалу (1 значение из интервала)  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1150
invm
Справедливости ради - таки можно без рекурсии:
with a as
(
 select
  a.*,
  b.x - lag(b.x, 1, b.x) over (partition by a.userid order by a.dt) as d
 from
  @t a cross apply
  (select datediff(mi, '1900', a.dt)) b(x)
),
b as (select *, sum(d) over (partition by a.userid order by a.dt) % 20 as drt from a),
c as (select userid, dt, case when drt % 20 < lag(drt % 20, 1, drt + 1) over (partition by userid order by dt) then 1 else 0 end as f from b)
select userid, dt from c where f = 1;

А вот и нет.
Не выводит последнюю запись.
И вот с таким датасетом - не выведет последний интервал на 2 записи:
declare @t as table (userid int, dt datetime2(0))
insert into @t select 1,         '2019-07-01 06:58:00'
union select 1,			 '2019-07-01 07:12:15' --<
union select 1,			 '2019-07-01 07:19:15'
union select 1,			 '2019-07-01 07:22:01' --<
union select 1,			 '2019-07-01 07:42:01'
union select 1,			 '2019-07-01 07:45:15'; --<
30 июл 19, 12:27    [21937756]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временному интервалу (1 значение из интервала)  [new]
invm
Member

Откуда: Москва
Сообщений: 8891
with a as
(
 select
  a.*,
  b.x - lag(b.x, 1, b.x) over (partition by a.userid order by a.dt) as d
 from
  @t a cross apply
  (select datediff_big(ss, '1900', a.dt)) b(x)
),
b as (select *, sum(d) over (partition by a.userid order by a.dt) as drt from a),
c as (select userid, dt, row_number() over (partition by userid, drt / 1201 order by dt) as rn from b)
select
 userid, dt
from
 c
where rn = 1;
?
30 июл 19, 13:07    [21937804]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временному интервалу (1 значение из интервала)  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1150
invm,

Датасет:
insert into @t select 1,         '2019-07-01 07:00:00'
union select 1,			 '2019-07-01 07:19:15'
union select 1,			 '2019-07-01 07:20:00'
union select 1,			 '2019-07-01 07:40:01'
union select 1,			 '2019-07-01 07:45:15';


Должно быть 2 группы, а получилось 3
30 июл 19, 13:40    [21937838]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временному интервалу (1 значение из интервала)  [new]
MaksK
Member

Откуда:
Сообщений: 6
invm, результат не корректный.
30 июл 19, 14:07    [21937869]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Microsoft SQL Server Ответить