我有一个表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');
答案 0 :(得分:2)
可以使用row_number
找到时是第一天的事件出现。
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 |
答案 1 :(得分:2)
这是旧版本的解决方案:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=12ba0196cf90994d3c9d853ac62405fe
await asyncCall()
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')
实际上,子查询就是您所需要的;其余的可以在应用程序代码中处理。