Rev*_*ous 26 oracle date max analytic-functions
我们假设我提取了一些数据集.
即
SELECT A, date
FROM table
Run Code Online (Sandbox Code Playgroud)
我想要的是具有最大日期的记录(对于A的每个值).我可以写
SELECT A, col_date
FROM TABLENAME t_ext
WHERE col_date = (SELECT MAX (col_date)
FROM TABLENAME t_in
WHERE t_in.A = t_ext.A)
Run Code Online (Sandbox Code Playgroud)
但是我的查询真的很长...有一种最简洁的方法使用ANALYTICAL FUNCTION做同样的事情吗?
Jus*_*ave 51
分析函数方法看起来像
SELECT a, some_date_column
FROM (SELECT a,
some_date_column,
rank() over (partition by a order by some_date_column desc) rnk
FROM tablename)
WHERE rnk = 1
Run Code Online (Sandbox Code Playgroud)
请注意,根据您想要处理关系的方式(或者数据模型中是否可以绑定),您可能希望使用ROW_NUMBER或DENSE_RANK解析函数而不是RANK.
Ben*_*oit 19
如果date且col_date是相同的列,您应该只做:
SELECT A, MAX(date) FROM t GROUP BY A
Run Code Online (Sandbox Code Playgroud)
为什么不使用:
WITH x AS ( SELECT A, MAX(col_date) m FROM TABLENAME )
SELECT A, date FROM TABLENAME t JOIN x ON x.A = t.A AND x.m = t.col_date
Run Code Online (Sandbox Code Playgroud)
除此以外:
SELECT A, FIRST_VALUE(date) KEEP(dense_rank FIRST ORDER BY col_date DESC)
FROM TABLENAME
GROUP BY A
Run Code Online (Sandbox Code Playgroud)
你也可以使用:
SELECT t.*
FROM
TABLENAME t
JOIN
( SELECT A, MAX(col_date) AS col_date
FROM TABLENAME
GROUP BY A
) m
ON m.A = t.A
AND m.col_date = t.col_date
Run Code Online (Sandbox Code Playgroud)