0

我在 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亿行数据集中的四个极值点?(练习的重点)

所需的选择语句有效,但我不能使用“where”子句,因为它说 xmin 不是列。什么是正确的方法,或者万一我使用了正确的方法,正确的语法是什么?

4

1 回答 1

3

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

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 上有索引,这些都会运行得更快。在这种情况下,最后一个可能是最快的。

于 2013-01-23T14:12:43.753 回答