2012-10-09 94 views
6

我有這樣的與記錄的表:選擇5最新的SQL Server

id  timestamp    dose    drug_id 
1  2012-10-04 09:10:54   05     2 
1  2012-10-04 09:12:34   15     2 
1  2012-10-04 09:15:12   20     2 
1  2012-10-04 09:35:32   25     2 
1  2012-10-04 09:37:34   25     2 
1  2012-10-04 09:39:24   25     2 
1  2012-10-04 09:42:16   35     2 
1  2012-10-04 09:43:07   35     2 

我想要做的就是選擇最後5個使用的劑量值對於給定的藥物,所以在這種情況下,查詢應該返回35,25,20,15,05

我知道我可以使用TOP和ORDER BY以獲得最新的5項,但在這種情況下,它會返回副本(35,35,25,25,25)。

我應該用什麼來得到我想要的輸出?

+1

順便說一下,爲什麼'25'未列入名單? –

+1

@JohnWoo同樣的問題,因爲你可以用'GROUP BY'那麼,你不能你爲什麼不能爲了通過時間戳得到的結果你所要求的.. –

+0

的方式嗎? –

回答

12

我沒有訪問我的服務器來測試這一點,但不應該

SELECT TOP 5 dose 
FROM table_id 
GROUP BY dose 
ORDER BY max(time) desc; 

工作?

編輯:測試http://sqlfiddle.com/#!6/610c4/2,請注意,我還沒有使用timestamp只是time。適當修復。

+0

IM關閉一天,但會嘗試第一件事就是在早上,由於 – jere

+1

涼快涼快。請注意,我在測試時編輯了它,並發現以前的解決方案無法正常工作。這個應該。 – Hotchips

3
SELECT top 5 dose 
FROM table_id 
GROUP BY dose 
ORDER BY max(timestamp) desc 
3

這樣做是否有助於

DECLARE @T TABLE(ID INT,Time_Stamp DATETIME,Dose INT, Drug_Id INT) 
INSERT INTO @T VALUES 
(1,'2012-10-04 09:10:54',05,2), 
(1,'2012-10-04 09:12:34', 15,2), 
(1,'2012-10-04 09:15:12',20,2), 
(1,'2012-10-04 09:35:32',25,2), 
(1,'2012-10-04 09:37:34',25,2), 
(1,'2012-10-04 09:39:24',25,2), 
(1,'2012-10-04 09:42:16',35,2), 
(1,'2012-10-04 09:43:07',35,2) 


;WITH CTE AS(
SELECT *, Rn = ROW_NUMBER()OVER(PARTITION BY Dose ORDER BY Time_Stamp DESC) 
FROM @T) 
SELECT TOP 5 ID,Time_Stamp,Dose,Drug_Id 
FROM CTE 
WHERE Rn = 1 
ORDER BY Dose DESC 

enter image description here