sql - 如何在BigQuery中获取两行之间的差异**和**差异所在字段的名称?
问题描述
我在BigQuery中有一个这样的表:
姓名 | 电话号码 | 地址 |
---|---|---|
约翰 | 123456778564 | 1便士巷 |
约翰 | 873452987424 | 1便士巷 |
玛丽 | 845704562848 | 第五大道 87 号 |
玛丽 | 845704562848 | 林肯路 54 号 |
艾米 | 342847327234 | 4海洋大道大道 |
艾米 | 347907387469 | 杜鲁门路 98 号 |
我想获得一个表,其中包含两个连续行之间的差异以及出现差异的字段名称:
我的意思是:
姓名 | 场地 | 前 | 后 |
---|---|---|---|
约翰 | 电话号码 | 123456778564 | 873452987424 |
玛丽 | 地址 | 第五大道 87 号 | 林肯路 54 号 |
艾米 | 电话号码 | 342847327234 | 347907387469 |
艾米 | 地址 | 4海洋大道大道 | 杜鲁门路 98 号 |
我怎样才能做到这一点 ?我查看了其他帖子,但找不到符合我需要的内容。
谢谢
解决方案
一种方法是使用lag()
和union all
select name, 'phone', prev_phone as before, phone as after
from (select name, phone,
lag(phone) over (partition by name order by timestamp) as prev_phone
from t
) t
where prev_phone <> phone
union all
select name, 'address', prev_address as before, address as afte4r
from (select name, address,
lag(address) over (partition by name order by timestamp) as prev_address
from t
) t
where prev_address <> address
推荐阅读
- c - 查找该算法的时间复杂度
- apache-spark - 有没有办法使用 Spark Structured Streaming 来计算每日聚合?
- terraform - 带有 inline_policy 的 iam_assumable_role_custom
- azure - 如何在 MS Azure 上托管 docker-compose 应用程序?
- javascript - 如何在 JS 中解决这个变量问题(回调函数中的全局变量)
- reactjs - 从 MongoDB 查询持久化的 React WYSIWYG 数据
- redis - JEDIS 多事务执行返回 null 或空请求是什么意思?
- c# - Unity3D FollowCam 不跟随玩家车辆
- tfs - 如何使用 API 使用模板创建工作项
- javascript - onclick='检查();html 中的 return false' 导致 flask_wtf 从表单中获取任何值