У меня есть таблица Events, которая имеет 2 столбца dt
(Дата) и event
.Я пытаюсь получить новый счетчик событий на каждый день.Например, если событие появилось сегодня и завтра, то оно должно учитываться только на сегодняшний день (как оно показывается впервые) и должно быть исключено из подсчета завтрашнего дня.
+------------+-------+
| dt | event |
+------------+-------+
| 2019-02-01 | u1 |
| 2019-02-01 | u2 |
| 2019-02-01 | u3 |
| 2019-02-01 | u4 |
| 2019-02-01 | u1 |
| 2019-02-02 | u5 |
| 2019-02-02 | u1 |
| 2019-02-02 | u6 |
| 2019-02-02 | u4 |
| 2019-02-03 | u8 |
| 2019-02-03 | u9 |
| 2019-02-03 | u6 |
+------------+-------+
Я пытаюсьполучите следующий вывод:
+------------+-------------------------+
| dt | count(distinct c.event) |
+------------+-------------------------+
| 2019-02-01 | 4 |
| 2019-02-02 | 2 |
| 2019-02-03 | 2 |
+------------+-------------------------+
Я использую запрос:
with cte (dt,event,rnk) as
(
select dt,
event,
row_number() over (partition by dt order by event) as rnk
from events order by event
)
select e.dt, count(distinct c.event) from events e left join cte c
on e.event <> c.event where e.dt = c.dt
group by 1;
Но я не могу отфильтровать уже появившееся событие предыдущего дня.Я верю, что чего-то маленького не хватает.Результат моего запроса:
+------------+-------------------------+
| dt | count(distinct c.event) |
+------------+-------------------------+
| 2019-02-01 | 4 |
| 2019-02-02 | 4 |
| 2019-02-03 | 3 |
+------------+-------------------------+
Я не уверен, что функция LEAD / LAG может помочь решить проблему.Также есть способ, которым я мог бы достичь этого без использования каких-либо объединений.
Запросы на создание и вставку таблиц:
create table events (dt Date, event varchar(5));
insert into events values('2019-02-01', 'u1');
insert into events values('2019-02-01', 'u2');
insert into events values('2019-02-01', 'u3');
insert into events values('2019-02-01', 'u4');
insert into events values('2019-02-01', 'u1');
insert into events values('2019-02-02', 'u5');
insert into events values('2019-02-02', 'u1');
insert into events values('2019-02-02', 'u6');
insert into events values('2019-02-02', 'u4');
insert into events values('2019-02-03', 'u8');
insert into events values('2019-02-03', 'u9');
insert into events values('2019-02-03', 'u6');