获取最新日期的单个值

时间:2014-05-21 06:16:34

标签: sql oracle

我需要获得一个项目的最新价格(作为更大的选择语句的一部分),我无法弄明白。

表:

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

根据上面的例子,当查找第2项时,我需要将select的输出设为'20',而在寻找第2项时需要'13'。

我正在使用Oracle SQL

3 个答案:

答案 0 :(得分:1)

试试这个!

sql-server中也可以在Oracle sql

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

你需要Row_number()为ITEMID分区的所有记录分配一个number,这样每个组都会获得一个RN,然后按date desc排序获取最新记录

SEE DEMO

答案 1 :(得分:1)

也许是这样的:

测试数据

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)

<强>查询

;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

答案 2 :(得分:1)

最易读/可理解的SQL(在我看来)就是这样:

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;

假设您的表格的名称为table,并且您每天只有一个价格和商品(否则where条件将匹配每个商品多于一行)。或者,子选择可以写为自连接(不应该在性能上有所不同)。

我不确定其他答案使用的OVER / PARTITION。也许它们可以根据DBMS进行优化以获得更好的性能。