2012-10-09 83 views
6

Tengo una tabla con los registros de la siguiente manera:SELECT 5 más reciente de 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 

Lo que quiero hacer es seleccionar los 5 últimos valores de las dosis utilizadas para un fármaco determinado, por lo que en este caso la consulta debe return 35, 25, 20, 15, 05.

Sé que puedo usar TOP y ORDER BY para obtener las últimas 5 entradas, pero en este caso devolvería duplicados (35, 35, 25, 25, 25).

¿Qué debo usar para obtener la salida que quiero?

+1

por cierto, ¿por qué es '25' no incluidos en la lista? –

+1

@JohnWoo La misma pregunta, porque puede usar 'GROUP BY ', entonces, no puede obtener los resultados de la forma en que está solicitando .. –

+0

¿por qué no puede ORDENAR POR marca de tiempo? –

Respuesta

12

no tengo acceso a mi servidor para probar esto, pero no debería

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

trabajo?

EDITAR: Probado en http://sqlfiddle.com/#!6/610c4/2, tenga en cuenta que no he usado timestamp simplemente . Arregle apropiadamente.

+0

fijo estoy fuera del día, pero lo intentaré a primera hora de la mañana, gracias – jere

+1

Cool cool. Tenga en cuenta que lo edité cuando lo probé y descubrí que mi solución anterior no funcionaba. Este debería. – Hotchips

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

ayudará esto a

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

Cuestiones relacionadas