sql - SQL Presto:不支持相关子查询
问题描述
考虑表x
id,val
1,100
3,300
和表y
id
1
2
3
对于每一行,y
我想要val
from y 相等或最接近from的x
地方,如下所示:id
id
x
id,val
1,100
2,100
3,300
我试图用相关的子查询找到最接近的 id:
WITH
x AS (SELECT * FROM (VALUES (1, 100),(3, 300)) AS t(id, val)),
y AS (SELECT * FROM (VALUES 1,2,3) AS t(id))
SELECT *, (
SELECT x.id
FROM x
WHERE x.id <= y.id
ORDER BY x.id DESC
LIMIT 1
) as closest_id
FROM y
但我明白了
SYNTAX_ERROR: line 5:5: Given correlated subquery is not supported
我还尝试了左连接:
SELECT *
FROM y
LEFT JOIN x ON x.id <= (
SELECT MAX(xbis.id) FROM x AS xbis WHERE xbis.id <= y.id
)
但我得到了错误
SYNTAX_ERROR: line 7:5: Correlated subquery in given context is not supported
解决方案
您可以尝试根据小于条件加入,然后对结果进行分组并从分组中找到所需的数据:
WITH
x AS (SELECT * FROM (VALUES (1, 100),(3, 300),(4, 400)) AS t(id, val)),
y AS (SELECT * FROM (VALUES 1,2,3,4) AS t(id))
SELECT y.id as yId,
max(x.id) as xId,
max_by(x.val, x.id) as val
FROM y
JOIN x on x.id <= y.id
GROUP BY y.id
ORDER BY y.id
输出:
身份证 | xId | 值 |
---|---|---|
1 | 1 | 100 |
2 | 1 | 100 |
3 | 3 | 300 |
4 | 4 | 400 |
推荐阅读
- jenkins - 我有一个 groovy utils 文件,其中包含一些方法,一种方法如何调用另一种方法
- php - codeigniter 登录 2 用户
- spring - 无法通过 Kubernetes 入口访问 websocket
- java - 如何将 30 分钟添加到我的输入时间并循环播放,直到我的输入结束时间为 12 小时格式(上午/下午)
- rest - 当前 REST API 的 GRPC 设计
- android - 无法使用转换 JetifyTransform 转换文件“some-lib-release.aar”以匹配属性 {artifactType=processed-aar}
- html - 在css中使用透明空间覆盖图像
- javascript - 以科学记数法将数字写入 JSON,这样它们就不会被引号引起来
- google-cloud-firestore - Flutter Firestore 日期
- python - 如何通过 Python 和 Selenium 从下拉菜单中单击元素