Mysql 每天新事件计数

Mysql 每天新事件计数,mysql,sql,Mysql,Sql,我有一个表Events,它有两列dt Date和event。我正在尝试获取每天的新事件计数。例如,如果事件出现在今天和明天,则应仅在第一次出现时计入今天,并应排除在明天的计数之外 +------------+-------+ | dt | event | +------------+-------+ | 2019-02-01 | u1 | | 2019-02-01 | u2 | | 2019-02-01 | u3 | | 2019-02-01 | u4 |

我有一个表Events,它有两列dt Date和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;
我不确定超前/滞后功能是否有助于解决该问题。 还有一种方法可以在不使用任何连接的情况下实现这一点

表创建和插入查询:

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');
您可以使用row_number查找事件第一天出现的时间

输出

您可以使用row_number查找事件第一天出现的时间

输出


以下是针对旧版本的解决方案:


实际上,子查询就是您所需要的;其余部分可以在应用程序代码中处理。

以下是针对旧版本的解决方案:


实际上,子查询就是您所需要的;其余的可以在应用程序代码中处理。

我认为2019-02-03计数应该只有2,因为u6已经在第2天了。我认为2019-02-03计数应该只有2,因为u6已经在第2天了2@NickDon delete是一个不同的方法,OP可以从中学习,我第一次想到这样做,直到意识到OP使用的是新版本的MySql,并且可以使用row_Numberm,这两种解决方案都需要@草莓解决方案的“新”版本,我的解决方案绝对不是必需的。@Nick dont delete是另一种解决方案,OP可以从中学习,我第一次想到这样做,直到意识到OP使用的是新版本的MySql,并且可以使用row_NumberEM,这两种解决方案都需要@草莓解决方案的“新”版本,我的解决方案也绝对不需要。
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');
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 |
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