我有以下关系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 |
-------------------------------------
我必须查询发票的Id
和Total
属性,其中Total
和Country
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
?
答案 0 :(得分:6)
一种简单的方法是获取美国发票,按总数(降序)排序并取最高值;
SELECT *
FROM invoice i
WHERE country = 'USA'
ORDER BY total DESC
LIMIT 1
如果您有多张具有相同总额的发票并且想要全部,则可以使用公用表格表达式按总计(降序)排名并获取所有排名最高的发票;
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;