【问题标题】:Taking the record with the max date以最大日期记录
【发布时间】:2012-02-12 10:58:30
【问题描述】:

假设我提取了一些数据。

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 analytic-functions


    【解决方案1】:

    分析函数方法看起来像

    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_RANK 分析函数而不是RANK

    【讨论】:

    • @Gik25 - 如果TABLENAME 中有两行具有相同的A 值和相同的SOME_DATE_COLUMN 值,则会出现平局。您的原始查询将像我的一样返回这两行。另一方面,如果您使用 ROW_NUMBER 函数,则只会返回两行中的一个(尽管选择返回哪一行是任意的)。
    【解决方案2】:

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

    【讨论】:

    • @Matt:是的,但前提是 OP 只需要这两列而不是整行(正如问题所暗示的那样)。
    • @ypercube 我同意,这就是问题的样子
    • 我无法在我的 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
    【解决方案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
    

    【讨论】:

    • 如果(a, col_date) 上有一个索引,这将是一个不错的选择,尤其是如果每个不同的 A 值都有很多日期。
    【解决方案4】:

    A 是 key,max(date) 是 value,我们可以将查询简化如下:

    SELECT distinct A, max(date) over (partition by A)
      FROM TABLENAME
    

    【讨论】:

      【解决方案5】:

      Justin Cave 的答案是最好的,但如果你想要另一个选项,试试这个:

      select A,col_date
      from (select A,col_date
          from tablename 
            order by col_date desc)
            where rownum<2
      

      【讨论】:

        【解决方案6】:

        从 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 以防万一您的字段中有空值。

        【讨论】:

          【解决方案7】:
          SELECT mu_file, mudate
            FROM flightdata t_ext
           WHERE mudate = (SELECT MAX (mudate)
                               FROM flightdata where mudate < sysdate)
          

          【讨论】:

          • 这似乎与问题不符?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-08
          • 2021-03-17
          • 2011-06-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多