我有一张如下表格
event_date id
---------- ---
2015-11-18 x1
2015-11-18 x2
2015-11-18 x3
2015-11-18 x4
2015-11-18 x5
2015-11-19 x1
2015-11-19 x2
2015-11-19 y1
2015-11-19 y2
2015-11-19 y3
2015-11-20 x1
2015-11-20 y1
2015-11-20 z1
2015-11-20 z2
问题:如何为每个日期获取唯一的ID计数(这样我们只计算那些在以前的记录中看不到的id)?像这样:
event_date count(id)
----------- ---------
2015-11-18 5
2015-11-19 3
2015-11-20 2
每个ID只应计算一次,无论它是出现在同一日期组内还是其他日期。
答案 0 :(得分:4)
您可以按日期分组,并对每个组的ID应用不同的计数:
SELECT event_date, COUNT(DISTINCT id)
FROM mytable
GROUP BY event_date
答案 1 :(得分:4)
虽然我不确定是否喜欢,但这是一个可以解决问题的答案:
ViewPager
我知道它有效,因为我测试了您的数据以获得您想要的结果。
这实际上适用于此数据但是如果您的日期组仅包含重复的ID,例如,如果在行之间,您还有一行select t.event_date,
count(1)
from (
-- Record first occurrence of each id along with the earliest date occurred
select id,
min(event_date) as event_date
from
mytable
group by id
) t
group by t.event_date;
,则不会显示任何记录('2016-01-01', 'z2')
因为2016-01-01
是重复的。如果您需要在结果中返回一行:
2016-01-01 0
然后,你必须使用GROUP BY的LEFT JOIN。
答案 2 :(得分:0)
SELECT EVENT_DATE,COUNT (DISTINCT ID)
FROM MYTABLE
WHERE NOT EXISTS
(SELECT * FROM MYTABLE T2 WHERE
T2.EVENT_DATE<MYTABLE.EVENT_DATE AND T2.ID=MYTABLE.ID)
GROUP BY EVENT_DATE
答案 3 :(得分:0)
编辑:废话,对不起Spade。下面是一个示例,说明如果您希望为简单的event_date条目显示零,则Spade所指的是什么。
我会按照这个方式做点什么......
select
a.event_date,
count(a.id) cnt_id
from
table_name a
left outer join
(
select x.id, min(x.event_date) min_event_date from table_name x
) b on
a.id = b.id AND
a.event_date = b.min_event_date
GROUP BY
a.event_date
答案 4 :(得分:-1)
SELECT
mytable.event_date
event_date_count.id,
event_date_count.event_date_count
FROM
mytable
INNER JOIN
(
SELECT
id,
event_date,
COUNT(event_date) as event_date_count
FROM
mytable
GROUP BY
id,
event_date
) event_date_count
ON event_date_count.event_date = mytable.event_date
这将为您提供日期,结果集以及在该日期找到该ID的次数的结果集。
释放加入包含聚合的select语句的强大功能。