2012-01-27 41 views
1

這是我(簡化)表:SQL查詢來檢索只出現一次每個ID

id  eventName  seriesKey eventStart 
1  Event1   5000   2012-01-01 14:00:00 
2  Event2   5001   2012-01-01 14:30:00 
3  Event3   5000   2012-01-01 14:50:00 
4  Event4   5002   2012-01-01 14:55:00 
5  Event5   5001   2012-01-01 15:00:00 
6  Event6   5002   2012-01-01 15:30:00 
7  Event7   5002   2012-01-01 16:00:00 

我必須建立一個由eventStart (ASC)定購表的查詢,但每個seriesKey,我只需要出現一次。

非常感謝你

+1

哪個EventStart應該是返回的?第一/最後一個/不關心一個? – 2012-01-27 09:25:15

+0

請在您的問題中包含您希望輸出內容的樣子。此外,如果您可以提供您的餐桌名稱,那將有助於我們爲您量身定製一個答案。 – 2012-01-27 09:59:29

回答

2

如果您還需要與關鍵字相關聯的其他列,你有兩個選擇:

select * 
from (
    select id, 
     eventName, 
     seriesKey, 
     eventStart, 
     row_number() over (partition by seriesKey order by eventStart) as rn 
    from the_event_table 
) t 
where rn = 1 
order by eventStart 

或老年人DBMS不支持開窗功能:

select t1.id, 
     t1.eventName, 
     t1.seriesKey, 
     t1.eventStart 
    from the_event_table t1 
    where t1.eventStart = (select min(t2.eventStart) 
         from the_event_table t2 
         where t2.seriesKey = t1.seriesKey) 
    order by eventStart 
+0

謝謝你,第二個爲我工作!:) – 2012-01-31 11:23:22

4

嘗試與GROUP BY聚合並使用像MIN()這樣的聚合函數。

SELECT seriesKey, 
     MIN(eventStart) eventStart 
FROM events 
GROUP BY seriesKey; 

這導致:

5000 2012-01-01 14:00:00.000 
5001 2012-01-01 14:30:00.000 
5002 2012-01-01 14:30:00.000 

如果your're有意從事件表,而不僅僅是上述兩個欄我選擇所有列,還有在一些數據庫中一個奇特的執行方式(例如SQL服務器),它可以幫助你:

1 Event1 5000 2012-01-01 14:00:00.000 
2 Event2 5001 2012-01-01 14:30:00.000 
6 Event2 5002 2012-01-01 14:30:00.000 

SELECT * 
FROM events e1 
WHERE e1.ID IN 
(
     SELECT TOP 1 e2.ID 
     FROM  events e2 
     WHERE e2.seriesKey = e1.seriesKey 
     ORDER BY e2.eventStart 
); 

,導致

+0

謝謝你的答案,但它不工作:(它只檢索一個最小的事件行起始值 – 2012-01-27 09:50:21

+0

@Alessandro你確定它只是檢索一行?我試了幾次,它返回3行。我添加了輸出到我的答案。 – 2012-01-27 10:16:51

0

你可以得到較早的日期爲每個seriesKey:

select * from 
(
select seriesKey, min(eventStart) as mindate 
group by seriesKey 
) 
order by mindate