sql - 如何根据同一个表中的其他列匹配替换空值

标签 sql google-cloud-platform google-bigquery

如果这是一个基本问题,我深表歉意,但我刚刚开始使用 SQL 和 BigQuery。

我有一个表,其中有 2 个用于不同事件的特定唯一标识符,如下所示:

+--------+----------+--------+
|  Type  | Instance | Userid |
+--------+----------+--------+
| event1 | abc123   | user1  |
| event1 | abc123   | user1  |
| event2 | abc123   | null   |
| event2 | def456   | null   |
| event1 | def456   | user2  |
+--------+----------+--------+

记录的信息取决于事件类型,事件1记录两种类型的标识,事件2仅记录一种类型(以节省空间)。如何使用为两种事件类型记录的实例标识符作为查找,以将 userid 中的空值替换为相应的用户值:即我们知道实例“abc123”是 user1 的产品,因此任何事件(例如 event2)实例为“abc123”且 userid 为空值时,应将空值替换为“user1”。结果是这样的:

+--------+----------+--------+
|  Type  | Instance | Userid |
+--------+----------+--------+
| event1 | abc123   | user1  |
| event1 | abc123   | user1  |
| event2 | abc123   | user1  |
| event2 | def456   | user2  |
| event1 | def456   | user2  |
+--------+----------+--------+

我研究过诸如 COALESCEIFNULL 之类的函数,但我不确定我的 BigQuery 版本以及所有不同风格是否支持它们JOIN 似乎假设不同的表(我只在隔离环境中使用该表)。

最佳答案

您可以使用窗口函数获取一个值:

select type, instance,
       coalesce(userid, max(userid) over (partition by instance))
from t;

关于sql - 如何根据同一个表中的其他列匹配替换空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56039432/

相关文章:

sql - 如何在sql server management studio中查找linked_server名称?

sql - 日期之间一天中的小时数

go - 尝试通过 vendor 目录部署Google Cloud功能时出错

google-cloud-platform - 用于插入特定 BigQuery 数据集的 IAM 自定义角色

sql - 应用 GROUP BY 后检查相同数量(棘手的场景)

php - 如何在 MySQL 中运行更新查询并替换匹配的字符串

go - 在哪里可以找到gcloud调用的API?

google-compute-engine - Google Compute Engine 磁盘快照与可重用镜像

google-bigquery - 如何更改 BigQuery 控制台(Web UI)中的默认选项,尤其是取消选中 "Use Legacy SQL"?

google-bigquery - BigQuery - 最大数据集大小