【问题标题】:Retrieve the attributes of a row which has the maximum value for a column检索具有列最大值的行的属性
【发布时间】:2014-10-24 07:23:04
【问题描述】:

我有以下关系Invoice

Invoice
-------------------------------------
| Id | Country | Total | CustomerId |
-------------------------------------
| 1  | USA     | 22.32 | 3          |
-------------------------------------
| 2  | Belgium | 12.18 | 4          |
-------------------------------------
| 3  | USA     | 27.76 | 2          |
-------------------------------------
| 4  | France  | 24.52 | 5          |
-------------------------------------
| 5  | USA     | 14.29 | 3          |
-------------------------------------

我必须查询发票的属性IdTotal,其中TotalCountry USA 的值最高。如果来自美国的多张发票具有相同的最大值,则必须在结果集中返回所有发票。

我目前的情况如下:

SELECT
   i."Id",
   i."Total"
FROM 
   public."Invoice" i
WHERE
   i."Total" = (SELECT MAX(t."Total") 
                   FROM public."Invoice" t 
                   WHERE t."Country" = 'USA');

这是正确的做法吗?我不确定,因为如果i.Id = t.Id,我不检查子查询。如果我这样做,我会在结果中得到不止一行。如何确保子查询返回的值确实属于i

【问题讨论】:

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


    【解决方案1】:

    一种简单的方法是获取美国发票,按总额(降序)排序并取最高值;

    SELECT * 
    FROM invoice i
    WHERE country = 'USA'
    ORDER BY total DESC
    LIMIT 1
    

    An SQLfiddle to test with.

    如果您有多个总金额相同的发票并且想要全部发票,则可以改为使用公用表表达式按总金额(降序)对它们进行排名,并获取所有排名最高的发票;

    WITH cte AS (
      SELECT *, DENSE_RANK() OVER (ORDER BY total DESC) rank FROM invoice i
      WHERE country = 'USA'
    )
    SELECT id, country, total, customerid
    FROM cte WHERE rank=1;
    

    Another SQLfiddle.

    【讨论】:

    • 如果多张美国发票的最大值相同,会发生什么情况?这个解决方案总是返回一行,对吧?
    • 是的。对不起,我忘了提。我现在将编辑答案。
    • 您对我的解决方案有何看法?这是正确的吗?它确实给了我想要的东西,但我很困惑,因为我没有在子查询中检查 ID。
    • @Djihad 您的解决方案的问题是,如果美国的最高总额为 57 美元,您还将从迪拜退回所有 57 美元的发票。也就是说,您找到了美国的最大值,但得到了 any 具有相同价值的发票。要更正它,您也可以将 AND i.country='USA' 添加到外部查询中。
    • 是的,没错。我没想到。但不幸的是,我不能使用你的第二种解决方案。我不允许使用DENSE_RANK()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 2015-07-12
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多