【问题标题】:Select the record with the greatest value in Oracle选择Oracle中值最大的记录
【发布时间】:2014-05-14 18:49:39
【问题描述】:

我遇到了一个查询,其中一个表有许多相同 id 的记录,并且列具有不同的值,如下所示:

ID  Name Location  Daysdue  date
001 MINE NBI       120      13-FEB-2013
001 TEST MSA       111      14-FEB-2013
002 MINE NBI       13       13-FEB-2013
002 MINE MSA       104      15-FEB-2013

我想返回到期天数最高的一条记录,所以我写了一个查询:

select id,max(daysdue),name,location,date group by id,name,location,date;

此查询不是返回一条记录,而是为每个 id 返回几条记录,因为我已将每一列分组,表明这些列是不同的。无论其他列中的其他值如何,根据 id 选择具有最大到期天数的行的最佳方法是什么??

例如,我想将其返回为:

001 MINE NBI       120      13-FEB-2013
002 MINE MSA       104      15-FEB-2013

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    看来你想要类似的东西

    SELECT *
      FROM (SELECT t.*,
                   rank() over (partition by id
                                    order by daysDue desc) rnk
              FROM table_name t)
     WHERE rnk = 1
    

    根据您希望如何处理平局(两行具有相同的id 和相同的daysDue),您可能需要dense_rankrow_number 函数而不是rank

    【讨论】:

    • 如果我有两条记录的过期天数相同,那么这个查询将返回两条记录
    • @Stanley 如何决定返回哪条记录?
    • @Stanley - 正确。这就是为什么我问你想如何处理关系。您可以使用row_number 函数而不是rank 任意选择一行。您可以在rank 中向order by 添加其他条件,以确保您可以选择特定的行。
    • 我只需要返回一行,因为我想计算行数。查询可以返回任何关系行。
    • @Stanley - 如果您想任意选择一行,请使用row_number 代替rank。但是,如果您只想计算行数,那么您真的只想做一个select count( dsitinct id ) from table_name
    【解决方案2】:

    首先你需要为每个ID找到MAX(daysdue)

    SELECT
        ID,
        MAX(daysdue) AS max_daysdue
    FROM table
    GROUP BY ID;
    

    然后你可以将你原来的表加入这个。

    SELECT t.* 
    FROM
        table t
        JOIN (
            SELECT
                ID,
                MAX(daysdue) AS max_daysdue
            FROM table
            GROUP BY ID
        ) m ON
            t.ID = m.ID
            AND t.daysdue = m.max_daysdue;
    

    请注意,如果出现平局,您可能会有重复的 id ——我猜这在语义上是有意义的。

    【讨论】:

    • @Stanley 我不认为它是独一无二的。此查询的结果与您的预期结果有何不同?
    • 这仍然给了我重复的记录。我没有任何独特的列:(
    【解决方案3】:
    SELECT 
      id,daysdue,name,location,date 
    FROM your_table 
      WHERE daysdue = (
        SELECT max(daysdue) FROM your_table
      );
    

    【讨论】:

    • 我几乎猜到了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多