检索具有列的最大值的行的属性

时间:2014-10-24 07:23:05

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

我有以下关系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

1 个答案:

答案 0 :(得分:6)

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

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

相关问题