我们假设我提取了一些数据集。
即
SELECT A, date
FROM table
我只想要带有最大日期的记录(对于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)
但是我的查询真的很长...使用ANALYTIC FUNCTION做一个更紧凑的方法吗?
答案 0 :(得分:50)
分析函数方法看起来像
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
请注意,根据您希望处理关系的方式(或数据模型中是否可以绑定),您可能希望使用ROW_NUMBER
或DENSE_RANK
解析函数而不是{{ 1}}。
答案 1 :(得分:18)
如果date
和col_date
列相同,则应该执行以下操作:
SELECT A, MAX(date) FROM t GROUP BY A
为什么不使用:
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
否则:
SELECT A, FIRST_VALUE(date) KEEP(dense_rank FIRST ORDER BY col_date DESC)
FROM TABLENAME
GROUP BY A
答案 2 :(得分:9)
你也可以使用:
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
答案 3 :(得分:2)
A是关键,max(date)是值,我们可以简化查询,如下所示:
textarea[n]
答案 4 :(得分:1)
Justin Cave的答案是最好的,但如果您想要选择其他选项,请尝试以下方法:
select A,col_date
from (select A,col_date
from tablename
order by col_date desc)
where rownum<2
答案 5 :(得分:1)
从 Oracle 12C 开始,您可以使用 FETCH FIRST ROW ONLY
获取特定数量的行。
在您的情况下,这意味着 ORDER BY
,因此应考虑性能。
SELECT A, col_date
FROM TABLENAME t_ext
ORDER BY col_date DESC NULLS LAST
FETCH FIRST 1 ROW ONLY;
NULLS LAST
以防万一您的字段中可能有空值。
答案 6 :(得分:-4)
SELECT mu_file, mudate
FROM flightdata t_ext
WHERE mudate = (SELECT MAX (mudate)
FROM flightdata where mudate < sysdate)