sql - 如何避免在 BigQuery 中自我加入
问题描述
我有下表,我想从那里添加具有前一个值的另一列:
ID | 以前的身份证 | 价值 |
---|---|---|
30 | 20 | 8000 |
20 | 10 | 5000 |
输出如下:
ID | 上一个_id | 价值 | Previous_Value |
---|---|---|---|
30 | 20 | 8000 | 5000 |
20 | 10 | 5000 | - |
我知道我可以运行您可以在下面看到的自我加入,但我想知道是否有更好的做法,因为这是我必须在其他类似用例中定期运行的操作。我已经尝试过分析函数,但我找不到它们的解决方案......
SELECT t1.*, t2.Value as Previous_Value
FROM `Table` t1
LEFT JOIN `Table`t2
ON t1.Previous_id = t2.id
解决方案
自联接是正确的方法,因为您的数据是“链接的”。
如果先前的 id 严格来说是在给定 id 之前以数字形式出现的 id,则可以使用LAG()
:
SELECT t.*, LAG(t.Value) OVER (ORDER BY t.id) as Previous_Value
FROM `Table` t;
但是,您的数据中可能不是这种情况(尽管您的示例数据中是这种情况)。
在性能方面,您无需过多担心JOIN
. 它是一个等值连接,因此 BigQuery 应该知道如何以最佳方式运行它。
推荐阅读
- vuex - Nuxtjs /Vuex 不适用于复杂对象
- python - Crispy_forms_tags 在我的更新视图中没有用实例填写表单
- android - 照片被其他应用程序使用的相机拍摄后如何访问
- dart - 在 Flutter 中显示本地图像和服务器图像(带缓存)
- linux - Linux上的git也从另一个存储库上传文件
- reactjs - 如何在使用 create-react-app 创建的文件中导入 Emscripten 生成的 .wasm/js 文件
- docx4j - 使用 docx4j 不读取字体大小样式的 XHTML 到 Docx 转换
- mendix - 在 Mendix 中更新实体时,数据视图未更新
- c - 给定代码场景的时间复杂度
- python - python '环境已经崩溃'