提问人:Revious 提问时间:1/18/2012 最后编辑:ZygDRevious 更新时间:7/31/2021 访问量:230230
使用最大日期记录
Taking the record with the max date
问:
假设我提取了一些数据集。
即
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来做同样的事情?
答:
24赞
Benoit
1/18/2012
#1
如果 和 是相同的列,您应该简单地执行以下操作:date
col_date
SELECT A, MAX(date) FROM t GROUP BY A
为什么不使用:
WITH x AS ( SELECT A, MAX(col_date) m FROM TABLENAME GROUP BY A )
SELECT t.A, t.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
评论
5赞
ypercubeᵀᴹ
1/18/2012
@Matt:是的,但前提是 OP 只想要这 2 列而不是整行(正如问题中所暗示的那样)。
1赞
Matt Donnan
1/18/2012
@ypercube我同意,这就是问题的样子
1赞
EAmez
10/8/2018
我无法在我的 Oracle 11g 中使第三个查询起作用。第二个查询缺少 group by 子句。它应该是:WITH x AS ( SELECT A, MAX(col_date) m FROM TABLENAME **group by A**) SELECT A, date FROM TABLENAME t JOIN x ON x.A = t.A AND x.m = t.col_date
75赞
Justin Cave
1/18/2012
#2
分析函数方法如下所示
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
RANK
评论
5赞
Justin Cave
1/18/2012
@Gik25 - 如果有两行具有相同的值 for 和 相同的值,则会出现平局。您的原始查询将返回这两行,就像我的查询一样。另一方面,如果您使用该函数,则只会返回两行中的一行(尽管选择返回哪一行是任意的)。TABLENAME
A
SOME_DATE_COLUMN
ROW_NUMBER
10赞
ypercubeᵀᴹ
1/18/2012
#3
您还可以使用:
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
评论
1赞
APC
1/18/2012
如果 上有一个索引,这将是一个不错的选择,特别是如果 A 的每个不同值都有很多日期。(a, col_date)
-6赞
Robert
6/26/2015
#4
SELECT mu_file, mudate
FROM flightdata t_ext
WHERE mudate = (SELECT MAX (mudate)
FROM flightdata where mudate < sysdate)
评论
0赞
Nathan Tuggy
6/26/2015
这看起来与问题不符?
2赞
Aitor
1/19/2016
#5
贾斯汀·凯夫(Justin Cave)的答案是最好的,但如果您想要其他选项,请尝试以下方法:
select A,col_date
from (select A,col_date
from tablename
order by col_date desc)
where rownum<2
4赞
user2778168
12/7/2017
#6
A 是键,max(date) 是值,我们可以简化查询,如下所示:
SELECT distinct A, max(date) over (partition by A)
FROM TABLENAME
2赞
Nanorex
2/16/2021
#7
从 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
评论