首页 > 解决方案 > 根据其他列的最大值选择值

问题描述

我有几个关于我想在 Postgres 中制作的表格的问题。下表是我的输入:

ID 区域 数数 功能
1 100 20 活的
1 200 30 行业
2 400 10 活的
2 400 10 行业
2 400 20 教育
3 150 1 行业
3 150 1 教育

我想分组idfunction基于max area. 总结面积和计数的行。当面积相等时,它应该基于最大计数,当面积和计数相等时,它应该基于先验功能(我仍然必须决定教育是否先于工业,反之亦然)。所以结果应该是:

ID 区域 数数 功能
1 300 50 行业
2 1200 40 教育
3 300 2 行业

我尝试了很多东西,也许这很容易,但我不明白。有人可以帮助获得正确的 SQL 吗?

标签: sqlpostgresqlaggregate

解决方案


一种方法使用row_number()和条件聚合:

select id, sum(area), sum(count),
       max(function) over (filter where seqnum = 1) as function
from (select t.*,
             row_number() over (partition by id order by area desc) as seqnum
      from t
     ) t
group by id;

另一种方法使用“distinct on”:

select id, sum(area) over (partition by id) as area,
       sum(count) over (partition by id) as count,
       function
from t
order by id, area desc;

推荐阅读