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

时间:2019-05-08 11:12:26

标签: 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的所有不同版本是否支持它们似乎假设使用不同的表(我在一个隔离的环境中仅使用一个表)。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

戈登的答案无疑是最佳的(应该接受!)。

但是-由于您提到了JOIN,因此以下示例具有用于教育目的的联接。

首先,我从userID不为null的表中分离出所有不同的TypeInstanceUserid组合。然后将这个新数据集连接到原始表中,仅从这个新创建的数据子集中获取Userid

WITH
  userid_populated AS (
  SELECT
    distinct Type, Instance, Userid
  FROM
    t
  WHERE
    userid IS NOT NULL)
SELECT
  b.Type,
  b.Instance,
  a.Userid
FROM
  t AS a
LEFT JOIN
  userid_populated AS b
ON
  a.Type = b.Type
  AND a.Instance = b.Instance

希望这很有趣。