Jav*_*tor 1 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 |
-------------------------------------
Run Code Online (Sandbox Code Playgroud)
我必须查询属性Id和Total发票,其中Total和Country美国的价值最高.如果来自美国的多个发票具有相同的最大值,则必须在结果集中返回所有发票.
我到目前为止的内容如下:
SELECT
i."Id",
i."Total"
FROM
public."Invoice" i
WHERE
i."Total" = (SELECT MAX(t."Total")
FROM public."Invoice" t
WHERE t."Country" = 'USA');
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?我不确定,因为我没有检查子查询是否i.Id = t.Id.如果我这样做,我会在结果中获得多行.如何确保子查询返回的值实际属于i?
一种简单的方法是获取美国发票,按总数(降序)排序并取最高值;
SELECT *
FROM invoice i
WHERE country = 'USA'
ORDER BY total DESC
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
如果您有多个具有相同总额的发票并且想要全部,则可以使用公用表表达式对它们进行排序(降序)并获取所有排名最高的发票;
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;
Run Code Online (Sandbox Code Playgroud)