使用最大日期记录

Taking the record with the max date

提问人:Revious 提问时间:1/18/2012 最后编辑:ZygDRevious 更新时间:7/31/2021 访问量:230230

问:

假设我提取了一些数据集。

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来做同样的事情?

Oracle Date Max 分析函数

评论


答:

24赞 Benoit 1/18/2012 #1

如果 和 是相同的列,您应该简单地执行以下操作:datecol_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_NUMBERDENSE_RANKRANK

评论

5赞 Justin Cave 1/18/2012
@Gik25 - 如果有两行具有相同的值 for 和 相同的值,则会出现平局。您的原始查询将返回这两行,就像我的查询一样。另一方面,如果您使用该函数,则只会返回两行中的一行(尽管选择返回哪一行是任意的)。TABLENAMEASOME_DATE_COLUMNROW_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 ONLYORDER BY

SELECT A, col_date
FROM TABLENAME t_ext
ORDER BY col_date DESC NULLS LAST
FETCH FIRST 1 ROW ONLY;

以防万一您的字段中可能有空值。NULLS LAST