为每个id选择最大的多边形区域

问题描述 投票:0回答:1

我有一个子查询,会产生类似的结果

   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 个“重复项”。

postgresql postgis
1个回答
0
投票

略有更正,但大部分内容是迈克的直截了当的评论以及典型的答案细节:

每当您看到具有共同特征的组并希望仅保留每个组中的一个“顶级”特定记录时,您就会想到

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
标量子查询

© www.soinside.com 2019 - 2024. All rights reserved.