2016-04-29 90 views
1

我有一個像下面如何在SQL中獲取唯一值?

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應該只計算一次,無論它是否在同一個日期組內發生或否則。

+1

標籤使用,請在DBMS。 –

+2

你正在運行MySQL,SQL Server,Oracle,PostgreSQL或其他? – zedfoxus

回答

4

這裏有一個答案是會的工作,雖然我不知道我喜歡它:

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; 

我知道它的作品,因爲我與你的數據測試,以得到你想要的結果。

這實際上適用於這些數據,但如果你有這樣的僅包括重複的ID,例如,如果行中,你有一個多行('2016-01-01', 'z2')這不會爲2016-01-01因爲z2是顯示任何記錄的日期組一個副本。如果您需要在結果中返回一行:

2016年1月1日0

然後,你必須使用LEFT JOIN與GROUP BY。

sqlfiddle這裏

+0

你確定,你測試了嗎?你的內在查詢似乎並不正確。看看內部的GROUP BY。 – freetiger

+0

是的,我測試了它,但在MySQL上,但它應該不會有所不同。內部查詢確保每個id只在數據中出現一次,但正如我所說的,當您希望0爲某些日期的計數時,請注意邊緣條件。 – Spade

+0

SQL92及更早版本不允許查詢的選擇列表,HAVING條件或ORDER BY列表引用既未在GROUP BY子句中命名也未在功能上依賴(由GROUP BY列唯一確定) https的非聚合列://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html – freetiger

4

您可以通過日期組,並應用獨特的計數每羣組ID:

SELECT event_date, COUNT(DISTINCT id) 
FROM  mytable 
GROUP BY event_date 
+2

這不會解決重複的ID,因爲它只會在*日期內刪除ID *,而不是*在*日期。 – zimdanen

+0

以上評論絕對正確!爲了澄清,如果在以前的日期中從未見過ID,則這個ID將被稱爲UNIQUE。 – freetiger

+3

我不明白爲什麼人們在錯誤地回答問題。他們甚至讀過這個問題嗎? – freetiger

-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在那天被發現。

發揮加入選擇語句與聚合加入的力量。

+1

這不起作用。請再次檢查問題! – freetiger

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 
+0

這個也可以! – freetiger

+0

如果你喜歡,請檢查答案 –

0

編輯:廢話,對不起鏟。下面是一個Spade指的是如果你想爲一個簡單的event_date條目顯示一個零的例子。

我會做沿着此線的東西...

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