我在Postgres数据库的一个表中有两列x,y坐标。
我可以用以下方法找到x和y的极值:

select min(x), max(x), min(y), max(y)
from coords

如何将这些分配给类似这样的变量:
select min(x) as xmin, max(x) as xmax, min(y) as ymin, max(y) as ymax
from coords

实现
select y
from coords
where x = xmin

等等……为了得到5亿行数据集中的四个极值点?(练习要点)
所需的select语句可以工作,但我不能使用“where”子句,因为它说xmin不是一个列。什么是正确的方法,或者在不太可能使用正确方法的情况下,什么是正确的语法?

最佳答案

一种方法是使用联接和子查询:

select c.*
from coords c join
     (select min(x) as xmin, max(x) as xmax, min(y) as ymin, max(y) as ymax
      from coords
     ) clim
     on c.x in (clim.xmin, clim.xmax) or c.y in (clim.ymin, clim.ymax)

另一种方法是使用窗口函数:
select c.*
from (select c.*,
             least(row_number() over (order by x),
                   row_number() over (order by x desc),
                   row_number() over (order by y),
                   row_number() over (order by y desc)
                  ) as seqnum
      from coords c
     ) c
where seqnum = 1

另一种方法,如果你真的只想得到4分,那就是:
select * from coords order by x limit 1 union all
select * from coords order by x desc limit 1 union all
select * from coords order by y limit 1 union all
select * from coords order by y desc limit 1

对于这么多的行,如果在x和y上有索引,这些行的运行速度都会更快。在这种情况下,最后一行可能是最快的。

关于sql - 在PostgreSQL中查找最大/最小对,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14481736/

10-11 23:14