【问题标题】:Oracle SQL single distinct columnOracle SQL 单不同列
【发布时间】:2015-08-06 19:49:34
【问题描述】:

我想从下面的示例表中为每个不同的名称获取一条记录,其中包含最近的日期。

我希望查询的结果是:

Mark    Checked_in  04-AUG-15  Blue
Dan     Checked_in  08-JUL-15  Yellow 

示例表:

Name    Action      Date       Color
Mark    Checked_in  04-AUG-15  Blue
Mark    Checked_in  02-AUG-15  Black
Dan     Checked_in  02-JUL-15  Orange
Dan     Checked_in  08-JUL-15  Yellow

【问题讨论】:

    标签: sql oracle greatest-n-per-group


    【解决方案1】:
    WITH WithRN as (SELECT Name
            , Action
            , "Date"
            , Color
            , row_number() over (partition by Name order by "Date" desc) as RN
        FROM tableName)
    SELECT Name, Action, "Data", Color
    FROM WithRN
    WHERE RN = 1
    

    分析函数通常会比使用聚合连接到自身更好。

    【讨论】:

      【解决方案2】:

      使用内联视图生成包含唯一值和最大日期值的子集。这里我假设名称,然后将其连接回基集以生成所有所需的列,并且仅在在这种情况下问题 max(date)。

      SELECT A.Name, A.Action, A.Date, A.Color
      FROM tableName A
      INNER JOIN (SELECT name, max(date) MDate from tableName group by name) B
       on A.Name = B.Name and A. Date = B.MDate
      

      这假定每个名称的日期都是唯一的。

      【讨论】:

        猜你喜欢
        • 2011-10-14
        • 1970-01-01
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多