2012-10-09 34 views
6

Ho una tabella con i record in questo modo:SELEZIONA 5 più recente di 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 

Quello che voglio fare è selezionare gli ultimi 5 valori di dose utilizzati per un dato farmaco, quindi in questo caso la query deve return 35, 25, 20, 15, 05.

So che posso utilizzare TOP e ORDER BY per ottenere le ultime 5 voci, ma in questo caso restituirei duplicati (35, 35, 25, 25, 25).

Cosa devo usare per ottenere l'output che desidero?

+1

a proposito, perché è '25' non inclusi nella lista? –

+1

@JohnWoo La stessa domanda, perché è possibile utilizzare 'GROUP BY', quindi, non è possibile ottenere i risultati nel modo desiderato. –

+0

perché non è possibile ORDINARE l'ora? –

risposta

12

Non ho accesso al mio server per verificare questo, ma non dovrebbe

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

lavoro?

MODIFICA: Testato su http://sqlfiddle.com/#!6/610c4/2, si noti che non ho utilizzato timestamp semplicemente time. Correggi in modo appropriato.

+0

im off per il giorno, ma proverò prima cosa al mattino, grazie – jere

+1

Cool cool. Si noti che l'ho modificato quando ho provato e ho scoperto che la mia soluzione precedente non funzionava. Questo dovrebbe. – Hotchips

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

questo aiuterà

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

Problemi correlati