我有下表:
-----------------------------------------------------------
ID oDate oName oItem oQty oRemarks
-----------------------------------------------------------
1 2016-01-01 A 001 2
2 2016-01-01 A 002 1 test
3 2016-01-01 B 001 3
4 2016-01-02 B 001 2
5 2016-01-02 C 001 2
6 2016-01-03 B 002 1
7 2016-01-03 B 001 4
ff.
我想获得每个名字的最新记录。所以结果应该是这样的:
-----------------------------------------------------------
oDate oName oItem oQty oRemarks
-----------------------------------------------------------
2016-01-01 A 001 2
2016-01-01 A 002 1 test
2016-01-02 C 001 2
2016-01-03 B 002 1
2016-01-03 B 001 4
ff.
有谁知道如何获得这个结果?
谢谢。
答案 0 :(得分:4)
rank
窗口子句允许您根据某些分区对行进行排名,然后您可以选择最顶层的行:
SELECT oDate, oName, oItem, oQty, oRemarks
FROM (SELECT oDate, oName, oItem, oQty, oRemarks,
RANK() OVER (PARTITION BY oName ORDER BY oDate DESC) AS rk
FROM my_table) t
WHERE rk = 1
答案 1 :(得分:3)
这是一个不使用分析函数的通用查询。
的 SQLFiddle Demo
强>
SELECT a.*
FROM table1 a
INNER JOIN
(SELECT max(odate) modate,
oname,
oItem
FROM table1
GROUP BY oName,
oItem
)
b ON a.oname=b.oname
AND a.oitem=b.oitem
AND a.odate=b.modate
答案 2 :(得分:2)
我认为您需要这样的查询:
"1234"
答案 3 :(得分:2)
向表中添加primary key
假设id
字段并使其自动递增。然后按id
订购即可获得。这是传统的方式。使用您的表格,您只能按oDate
订购。但是多次有相同的日期,所以它也不会解决你的问题。
答案 4 :(得分:0)
您必须在以下内容中使用ROW_NUMBER
:
select oDate, oName, oItem, oQty, oRemarks
from (
select *, row_number() over(partition by oName, oItem order by oDate desc) rn
from #t
)x
where rn = 1
order by oDate
<强>输出强>
oDate oName oItem oQty oRemarks
2016-01-01 A 001 2
2016-01-01 A 002 1 test
2016-01-02 C 001 2
2016-01-03 B 001 4
2016-01-03 B 002 1