【问题标题】:Choose minumum result of SELECT query in Postgresql在 Postgresql 中选择 SELECT 查询的最小结果
【发布时间】:2012-07-12 07:23:29
【问题描述】:

我有以下查询,我想计算最接近“商店”类型建筑物的用户:

WITH y AS (
  SELECT t.userid as us, ST_Distance(t.thegeometry,b.thegeomtry) as dist
  FROM track t,buildings b
  WHERE b.type = 'store'
)
SELECT us 
FROM   y
WHERE  dist = (SELECT MIN(dist) FROM y)

问题是当我尝试计算最小值时,它给了我 0,这是不正确的。在我的数据中,ID 为 112 的用户与商店 A 之间的最小距离等于 2441 米。

【问题讨论】:

  • SELECT MIN(dist) FROM y y 必须是真实的表名,不是吗?
  • @DavidBélanger:CTE 即使在子查询中也是可见的。不过,这并不是必须的。

标签: sql postgresql minimum cross-join


【解决方案1】:

我假设 ST_Distance 是一个返回数字的函数,然后尝试使用以下查询:

SELECT
 t.userid AS us
,MIN (ST_Distance(t.thegeometry,b.thegeomtry)) AS dist
FROM track t, buildings b
WHERE b.type = 'store'
GROUP BY t.userid
ORDER BY 2
LIMIT 1

希望你能帮忙。
Victor Zurita M.

【讨论】:

    【解决方案2】:

    您的查询应该如下所示:

    SELECT t.userid AS us
          ,ST_Distance(t.thegeometry, b.thegeomtry) AS dist
    FROM   track t
    CROSS  JOIN buildings b
    WHERE  b.type = 'store'
    ORDER  BY dist 
    LIMIT  1;
    

    “找到离任何类型商店最近的用户”。
    无需 CTE 或聚合函数。

    您可能知道查询对于较大的表非常昂贵,因为您有效地在表 trackbuildings 之间形成了有限的交叉连接 - 这意味着 O(N²)

    我使用了明确的CROSS JOIN 语法(相当于以逗号分隔的表列表)来说明这一点。

    【讨论】:

      猜你喜欢
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2012-01-03
      • 2016-01-22
      相关资源
      最近更新 更多