每组最高的[英] Highest per each group

本文是小编为大家收集整理的关于每组最高的的处理方法,想解了每组最高的的问题怎么解决?每组最高的问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

这里很难显示我的实际表和数据,所以我将用一个示例表和数据来描述我的问题:

create table foo(id int,x_part int,y_part int,out_id int,out_idx text);

insert into foo values (1,2,3,55,'BAK'),(2,3,4,77,'ZAK'),(3,4,8,55,'RGT'),(9,10,15,77,'UIT'),
                       (3,4,8,11,'UTL'),(3,4,8,65,'MAQ'),(3,4,8,77,'YTU');

下面是表格foo:

id x_part y_part out_id out_idx 
-- ------ ------ ------ ------- 
3  4      8      11     UTL     
3  4      8      55     RGT     
1  2      3      55     BAK     
3  4      8      65     MAQ     
9  10     15     77     UIT     
2  3      4      77     ZAK     
3  4      8      77     YTU     

我需要通过对每个out_id的最高 id进行排序来选择所有字段.
预期输出:

id x_part y_part out_id out_idx 
-- ------ ------ ------ ------- 
3  4      8      11     UTL     
3  4      8      55     RGT     
3  4      8      65     MAQ     
9  10     15     77     UIT     

使用 PostgreSQL.

推荐答案

Postgres 特定(最快)的解决方案:

select distinct on (out_id) *
from foo
order by out_id, id desc;

使用 窗口函数标准 SQL 解决方案(第二快)

select id, x_part, y_part, out_id, out_idx
from (
  select id, x_part, y_part, out_id, out_idx, 
         row_number() over (partition by out_id order by id desc) as rn
  from foo
) t
where rn = 1
order by id;

请注意,即使有多个相同的 out_id 值,两种解决方案都只会返回每个 id 一次.如果您希望它们全部返回,请使用 dense_rank() 而不是 row_number()

本文地址:https://www.itbaoku.cn/post/1763963.html