我需要获得一个项目的最新价格(作为更大的选择语句的一部分),我无法弄明白。
表:
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
答案 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排序获取最新记录
答案 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进行优化以获得更好的性能。