在 sql 如何获得按两列分组的总和的最大值
in sql how to get the max of sum that is group by two columns
SELECT county, category_name, SUM(bottle_qty*(btl_price-state_btl_cost)) AS profit
FROM sales
GROUP BY county, category_name
ORDER BY profit DESC
我想要每个县的利润,category_name 是那个县产生最多利润的东西。
所以我只想要第一行、第8行和第11行:
您可以使用 distinct on
来解决这个每组最大 n 的问题:
SELECT DISTINCT ON(county)
county,
category_name,
SUM(bottle_qty*(btl_price-state_btl_cost)) AS profit
FROM sales
GROUP BY county, category_name
ORDER BY county, profit DESC
但是,这不允许您控制结果集中行的顺序。在这种情况下,请改用 row_number()
:
SELECT *
FROM (
SELECT
county,
category_name,
SUM(bottle_qty*(btl_price-state_btl_cost)) AS profit
ROW_NUMBER() OVER(
PARTITION BY county
ORDER BY SUM(bottle_qty*(btl_price-state_btl_cost)) DESC
) rn
FROM sales
GROUP BY county, category_name
) t
WHERE rn = 1
ORDER BY profit
SELECT county, category_name, SUM(bottle_qty*(btl_price-state_btl_cost)) AS profit
FROM sales
GROUP BY county, category_name
ORDER BY profit DESC
我想要每个县的利润,category_name 是那个县产生最多利润的东西。
所以我只想要第一行、第8行和第11行:
您可以使用 distinct on
来解决这个每组最大 n 的问题:
SELECT DISTINCT ON(county)
county,
category_name,
SUM(bottle_qty*(btl_price-state_btl_cost)) AS profit
FROM sales
GROUP BY county, category_name
ORDER BY county, profit DESC
但是,这不允许您控制结果集中行的顺序。在这种情况下,请改用 row_number()
:
SELECT *
FROM (
SELECT
county,
category_name,
SUM(bottle_qty*(btl_price-state_btl_cost)) AS profit
ROW_NUMBER() OVER(
PARTITION BY county
ORDER BY SUM(bottle_qty*(btl_price-state_btl_cost)) DESC
) rn
FROM sales
GROUP BY county, category_name
) t
WHERE rn = 1
ORDER BY profit