Количество новых событий на каждый день - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть таблица 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');

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Вот решение для более старых версий: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=12ba0196cf90994d3c9d853ac62405fe

CREATE TABLE events
    (`dt` varchar(10), `event` varchar(2))
INSERT INTO events
    (`dt`, `event`)
VALUES
    ('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')
SELECT dt, COUNT(*) total FROM
(SELECT event, MIN(dt) dt
      FROM events
      GROUP BY event) x
GROUP BY dt

На самом деле подзапрос - это все, что вам нужно;остальное можно обработать в коде приложения.

0 голосов
/ 02 февраля 2019

Вы можете использовать row_number, чтобы узнать, когда наступит первый день появления события.

SQL DEMO

WITH ranks as (
    SELECT *, row_number() over (partition by event order by dt) as rn
    FROM events
) 
SELECT dt, COUNT(event)
FROM ranks
WHERE rn = 1 
GROUP BY dt

ВЫХОД

|         dt | count |
|------------|-------|
| 2019-02-01 |     4 |
| 2019-02-02 |     2 |
| 2019-02-03 |     2 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...