2013-02-15 41 views
1

查詢我有一個表tbl有三列:選擇非組字段從聚合函數

id | fk | dateof 
1 | 1 | 2012-01-01 
2 | 1 | 2012-01-02 
3 | 2 | 2012-02-01 
4 | 2 | 2012-03-01 
5 | 3 | 2012-04-01 

id是該行的ID,fk是一個外鍵到另一個表和dateof是一個日期柱。

我想要的是id,其中dateoffk分組的最新版本。我已經試過:

SELECT id, MAX(dateof) FROM tbl GROUP BY fk 

但我得到的結果是這樣的:

1 | 2012-01-02 
3 | 2012-03-01 
5 | 2012-04-01 

當我想:

2 | 2012-01-02 
4 | 2012-03-01 
5 | 2012-04-01 

我怎樣才能查詢,並得到我期待的結果對於? MySQL服務器,如果它很重要。謝謝。

回答

4

個人而言,我會做

SELECT id, tbl.dateof dateof 
FROM tbl 
INNER JOIN 
(SELECT fk, MAX(dateof) dateof 
    FROM tbl 
    GROUP BY fk) temp 
ON tbl.fk = temp.fk AND tbl.dateof = temp.dateof 

戈登的答案是正確的,更少的代碼,但我更喜歡創建一個臨時表。其他開發人員更清楚我在做什麼。

+0

如果您將聯接切換爲正確的ANSI聯接語法,我會讓您滿意。 – 2013-02-15 20:22:22

+0

對不起,我一直是一個老學校加入的人。很難打破這種習慣。 – 2013-02-15 20:24:25

+0

+1。 。 。我正在嘗試在這個世界做一點點改變(推動ANSI連接語法;)。 – 2013-02-15 20:25:53

0

爲了得到你想要的東西:

select t.* 
from (select tbl.*, 
      row_number() over (partition by fk order by dateof desc) as seqnum 
     from tbl 
    ) t 
where seqnum = 1 

這是假設你正在使用具有窗口功能合理的數據庫。你不要在你的問題中指定數據庫。

+0

他正在使用MySQL - 他指定在底部,但沒有標記它 – 2013-02-15 20:21:07

+0

我是新來的,不確定MySQL和SQL是否太同義。我試過這個查詢,得到0的結果。在編寫時有幾個問題,比如第一個SELECT tbl。*,應該是SELECT t。*,no? – dlp 2013-02-15 20:26:13

+0

@dlp。 。 。這個查詢在MySQL中不起作用。馬特的解決方案是該數據庫的正確解決方案。所有其他主要數據庫都支持'row_number()'。 – 2013-02-15 20:29:00