很抱歉,如果这是一个基本问题,但是我刚刚开始使用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 |
+--------+----------+--------+
我已经研究过COALESCE
和IFNULL
之类的函数,但不确定我的BigQuery版本和JOIN
的所有不同版本是否支持它们似乎假设使用不同的表(我在一个隔离的环境中仅使用一个表)。
答案 0 :(得分:2)
您可以使用窗口函数获得一个值:
select type, instance,
coalesce(userid, max(userid) over (partition by instance))
from t;
答案 1 :(得分:0)
戈登的答案无疑是最佳的(应该接受!)。
但是-由于您提到了JOIN
,因此以下示例具有用于教育目的的联接。
首先,我从userID不为null的表中分离出所有不同的Type
,Instance
和Userid
组合。然后将这个新数据集连接到原始表中,仅从这个新创建的数据子集中获取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
希望这很有趣。