Obtenga un valor único donde la última date

Necesito get el último precio de un artículo (como parte de una statement de selección más grande) y no puedo entenderlo.

Mesa:

ITEMID DATE SALEPRICE 1 1/1/2014 10 1 2/2/2014 20 2 3/3/2014 15 2 4/4/2014 13 

Necesito que la salida de la selección sea '20' al search el elemento 1 y '13' al search el elemento 2 como se muestra en el ejemplo anterior.

Estoy usando Oracle SQL

El SQL más legible / comprensible (en mi opinión) sería este:

 select salesprice from `table` t where t.date = ( select max(date) from `table` t2 where t2.itemid = t.itemid ) and t.itemid = 1 -- change item id here; 

suponiendo que el nombre de su tabla es table y usted solo tiene un precio por día y artículo (de lo contrario, la condición donde coincidiría con más de una fila por artículo). Alternativamente, la subselección podría escribirse como una auto-unión (no debería hacer una diferencia en el performance).

No estoy seguro del OVER / PARTITION utilizado por las otras respuestas. Tal vez podrían optimizarse para un mejor performance según el DBMS.

Tal vez algo como esto:

Datos de testing

 DECLARE @tbl TABLE(ITEMID int,DATE DATETIME,SALEPRICE INT) INSERT INTO @tbl VALUES (1,'1/1/2014',10), (1,'2/2/2014',20), (2,'3/3/2014',15), (2,'4/4/2014',13) 

Consulta

 ;WITH CTE AS ( SELECT ROW_NUMBER() OVER(PARTITION BY ITEMID ORDER BY [DATE] DESC) AS rowNbr, tbl.* FROM @tbl AS tbl ) SELECT * FROM CTE WHERE CTE.rowNbr=1 

¡Prueba esto!

En sql-server también puede funcionar en Oracle sql

 select * from ( select *,rn=row_number()over(partition by ITEMID order by DATE desc) from table )x where x.rn=1 

Necesita Row_number () para asignar un number a todos los loggings, que es una partición por ITEMID, de modo que cada grupo obtendrá una RN, luego, cuando ordere por date desc, obtenga el último logging.

VER DEMO