Oracle:以最大日期记录

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_NUMBERDENSE_RANK解析函数而不是RANK.

  • @ Gik25 - 如果在`TABLENAME`中有两行具有相同的"A"值和"SOME_DATE_COLUMN"的相同值,则会出现平局.您的原始查询将返回这两行.另一方面,如果使用`ROW_NUMBER`函数,则只返回两行中的一行(尽管选择返回哪一行是任意的). (2认同)

Ben*_*oit 19

如果datecol_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)

  • @Matt:是的,但只有OP只想要这两列而不是整行(正如问题中隐含的那样). (3认同)

ype*_*eᵀᴹ 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
Run Code Online (Sandbox Code Playgroud)