postgresql - 从返回多列的函数中选择
问题描述
我有以下查询,它对位置进行聚类,并返回一个聚类 ID,以及一个包含该聚类内原始点的结构:
SELECT
cluster_id,
ST_AsGeoJSON(ST_Collect(origin)) AS points
FROM (
SELECT
origin,
ST_ClusterDBSCAN(origin, eps := 0.01, minPoints := 5) OVER(ORDER BY id) AS cluster_id
FROM
ride
WHERE
region_id = 1 AND
created_at > now() - interval '1 week'
) a
WHERE cluster_id IS NOT NULL
GROUP BY cluster_id
示例输出:
3 {"type":"MultiPoint","coordinates":[ ... ]}
4 {"type":"MultiPoint","coordinates":[ ... ]}
我不想返回原始点,而是想返回集群的边界圆(中心和半径),这可以使用ST_MinimumBoundingRadius
:
SELECT
ST_AsGeoJSON(center),
radius
FROM
ST_MinimumBoundingRadius(
ST_GeomFromGeoJSON('{"type":"MultiPoint","coordinates":[ ... ]}')
)
示例输出:
{"type":"Point","coordinates":[ ... ]} 0.002677744742706528
但是,由于ST_MinimumBoundingRadius
返回两列,下面会引发错误:
SELECT
cluster_id,
ST_MinimumBoundingRadius(ST_Collect(origin))
FROM (
...
) a
WHERE cluster_id IS NOT NULL
GROUP BY cluster_id;
我发现这个问题提到使用LATERAL
但我无法获得有效的查询。
这样做的正确方法是什么?
解决方案
尝试另一个子选择:
SELECT q.cluster_id,
(q.mbr).radius,
(q.mbr).center
FROM (
SELECT cluster_id,
ST_MinimumBoundingRadius(
ST_Collect(origin)
) AS mbr
FROM (
...
) AS a
) AS q;
推荐阅读
- rpc - 如何从 metamask api 获取自定义 rpc 信息;
- css - 如何有条件地在两列中呈现 div 元素
- visual-studio-code - VSCode 中的 FTP-Simple - 我可以在上传时保存本地副本吗?
- ios - 在 UITextField 和软件键盘 ios 之间提供最小填充
- python - 是否有任何功能可以在 Python 中将垂直阴影区域添加到折线图中?
- c - 我应该在哪里存储 .clang 格式的文件?
- python - 在作为列表的 pandas 的索引列中查找值
- json - 如何将 JSON 对象(这是一个列表)解析为 scala 中的简单 Scala 类对象?
- cardano - 节点看不到资金
- php - 如何从ajax内部的数据库中获取循环数据并按列显示在选择按钮中