很难在这里显示我的实际表格和数据,所以我会用样本表和数据来描述我的问题:
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
我需要通过对每个id
的最高 out_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。
答案 0 :(得分:4)
Postgres特定(和最快)的解决方案:
select distinct on (out_id) *
from foo
order by out_id, id desc;
使用window function(第二快)
的标准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;
请注意,即使有多个id
值相同,这两个解决方案也只会返回每个out_id
一次。如果您希望全部返回,请使用dense_rank()
代替row_number()
答案 1 :(得分:1)
select *
from foo
where (id,out_id) in (
select max(id),out_id from foo group by out_id
) order by out_id
答案 2 :(得分:1)
查找max(val)
:=查找不存在更大val
的记录:
SELECT *
FROM foo f
WHERE NOT EXISTS (
SELECT 317
FROM foo nx
WHERE nx.out_id = f.out_id
AND nx.id > f.id
);