我有一个子查询,会产生类似的结果
pointid | polygonid | area
-------------+------------+-------------
699724666 | 3810527 | 2.06199e-07
699927129 | 3810527 | 2.06199e-07
1022506588 | 4793274 | 1.7602e-07
1510712278 | 9888241 | 4.63377e-07
3633280129 | 14039247 | 1.4738e-07
767859914 | 14363105 | 1.21193e-05
1602741932 | 22982686 | 2.78871e-07
2094064279 | 23106078 | 1.72662e-07
23399836 | 23399836 | 7.93616e-07 -- this is the biggest area of both records
23399836 | 23458583 | 3.43948e-08 -- i don't need this
24203901 | 24203901 | 3.04905e-08
...
286850518 | 1190017878 | 4.48722e-10
11049705806 | 1190017879 | 1.22384e-09
334276998 | 1190578569 | 1.64479e-09
334276996 | 1190578570 | 1.45084e-09
1193281123 | 1193281123 | 4.718e-09
984013344 | 1194854105 | 6.69957e-10
11152960476 | 1203094927 | 1.23606e-09
(1611 rows)
按
polygonid, area desc
排序。 pointid
23399836 出现了两次,我只想要面积更大的那个。
换句话说:我需要所有记录,但在任何一组“重复项”中,只需要面积最大的记录。每个
pointid
甚至可能有超过 2 个“重复项”。
略有更正,但大部分内容是迈克的直截了当的评论以及典型的答案细节:
每当您看到具有共同特征的组并希望仅保留每个组中的一个“顶级”特定记录时,您就会想到
distinct on
:演示
select distinct on (pointid)--in parenthesis, you put the group's common feature
* --list what you want to get, as usual
from your_table
order by pointid, --the common feature comes first,
area desc; --rest of `order by` decides which one ends up "top"
可以通过其他方式获得该结果,但在您的场景中,这是最短且最有效的方式。每当您想要每组不止一条顶级记录时,您就需要考虑窗口函数,与
WITH
、CTE、横向子查询和SRF结合使用。如果您只想要一个,但发现用其他方式指定您的条件比“按此顺序中的第一个”更容易,请使用 limit
/offset
的标量子查询。