2017-05-27 160 views
-1

我想要做一個單一的SELECT查詢,該查詢返回每個ID的最新2條記錄(按日期排序)。對於每個給定的ID,日期值並不總是唯一的,所以我必須處理它(查看ID = 1,我只想得到2條記錄,儘管它有來自同一日期的2條記錄.. 。)每個ID的最後2條記錄(日期)的sql查詢

例如,此表:

+------+------------+-------+ 
| ID | Date | Value | 
+------+------------+-------+ 
| 1 | 2010  | 33 | 
| 1 | 2009  | 23 | 
| 1 | 2009  | 41 | 
| 1 | 2003  | 55 | 
| 1 | 2003  | 24 | 
| 2 | 2009  | 52 | 
| 2 | 2008  | 23 | 
| 2 | 2007  | 39 | 
| 2 | 2006  | 22 | 
|  
|  
| ... | ...  | ... | 
+------+------------+-------+ 

我將有望獲得:

+------+------------+-------+ 
| ID | Date | Value | 
+------+------------+-------+ 
| 1 | 2010  | 33 | 
| 1 | 2009  | 23 | 
| 2 | 2009  | 52 | 
| 2 | 2008  | 23 | 
| ... | ...  | ... | 
+------+------------+-------+ 

我使用這個腳本:

SELECT ID, Date, Value 
FROM MyTable 
WHERE Date >= IFNULL((SELECT Date 
         FROM MyTable AS T2 
         WHERE T2.ID = MyTable.ID 
         ORDER BY Date DESC 
         LIMIT 1 OFFSET 2), 
        0) 

如何顯示所需的結果?

+0

感謝您的快速響應! 但我可以解決這個問題,而不使用變量? 我可以找到更簡單的解決方案嗎? –

回答

2

您可以使用該變量,它跟蹤上一條記錄的id以及相同id值的分區內的記錄編號。

對於工作,你首先要確保你有一個有序的結果集,然後分配這兩個變量的值作爲記錄的順序被處理:

select id, date, value 
from (
     select * 
     from  mytable 
     order by id, date desc 
    ) ordered, 
    (select @rn := -1, @id := -1) init 
where if(@rn := if(@id = id, @rn + 1, if(@id := id, 1, 1)), @rn, @rn) < 3; 

if結構用於評估一個表達式,然後根據第一個表達式是否被認爲是false或true來評估其他東西。在這些表達式中有時會做出任務。

+0

感謝您的快速回復!但我可以在不使用變量的情況下解決這個問題嗎?我可以找到更簡單的解決方案嗎? –

+0

不可能,因爲你的表沒有唯一的id列。如果可能的話,那麼這將是可能的,但是查詢會比這個慢幾倍。 – trincot

+0

我明白了,非常感謝你的回答! –

1

首先,使用SELECT語句來獲得ORDER所有行與count沿着每個ID,例如:

SELECT id, `date`, `value`, 
@count := IF(@previous = id, @count + 1, 1) AS `count`, @previous := id 
FROM test, (SELECT @previous := 0, @count := 1) a 
ORDER BY id ASC, `date` DESC; 

一旦這樣做,你可以把它包裝成另一種選擇,讓只數的那些行< = 2,例如:

SELECT * 
FROM (
SELECT id, `date`, `value`, 
@count := IF(@previous = id, @count + 1, 1) AS `count`, @previous := id 
FROM test, (SELECT @previous := 0, @count := 1) a 
ORDER BY id ASC, `date` DESC 
) b 
WHERE b.count <= 2; 

這裏的SQL Fiddle

+0

感謝您的快速回復!但我可以在不使用變量的情況下解決這個問題嗎?我可以找到更簡單的解決方案嗎? –

+1

一個簡單的答案是否定的。你在這裏試圖做的是爲每個組應用「限制」,這是MySQL不支持開箱即用的。 –

+0

現在很清楚,非常感謝! –

相關問題