如何在SQL中获取唯一值?

时间:2016-04-29 17:57:00

标签: sql postgresql count

我有一张如下表格

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只应计算一次,无论它是出现在同一日期组内还是其他日期。

5 个答案:

答案 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。

sqlfiddle此处

答案 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语句的强大功能。