問題:
表A
NAME DATE COL1
------------------------------
A 2011/06/07 4
A 2011/06/09 6
A 2011/06/03 7
B 2011/06/29 5
B 2011/06/30 6
求查詢出每個NAME下的日期最大的結果
NAME DATE COL1
------------------------------
A 2011/06/09 6
B 2011/06/30 6
WITH a AS (
SELECT 'A' NAME,'2011/06/07' "DATE",'4' COL1 FROM dual UNION ALL
SELECT 'A' NAME,'2011/06/09' "DATE",'6' COL1 FROM dual UNION ALL
SELECT 'A' NAME,'2011/06/03' "DATE",'7' COL1 FROM dual UNION ALL
SELECT 'B' NAME,'2011/06/29' "DATE",'5' COL1 FROM dual UNION ALL
SELECT 'B' NAME,'2011/06/30' "DATE",'6' COL1 FROM dual
)
--方法一
SELECT NAME,"DATE",COL1 FROM
(SELECT NAME,"DATE",COL1,row_number() over (partition by NAME order by "DATE" desc) rn FROM a)
WHERE rn=1
;
--方法二
select NAME,max("DATE"),max(COL1)keep(dense_rank first order by "DATE" desc) col1
from a
group by name;
方法一
常規分析函數。
ROW_NUMBER :返回有序組中一行的偏移量,從而可用於按特定標準排序的行號
方法二
first / last從DENSE_RANK返回的集合中取出排在最前面(後面)的一個值的行(可能多行,因爲值可能相等),因此完整的語法需要在開始處加上一個集合函數以從中取出記錄