Google bigquery 使用BigQuery SQL语法匹配记录
我的表包含一些标识符,称它们为ID1和ID2,记录如下所示:Google bigquery 使用BigQuery SQL语法匹配记录,google-bigquery,Google Bigquery,我的表包含一些标识符,称它们为ID1和ID2,记录如下所示: ID1 ID2 01 1 01 1 01 2 01 2 01 2 02 2 02 2 02 3 02 3 02 3 ... 03 4 04 5 05 6 06 7 因为我可以通过ID1=02将ID2=3链接到ID2=2,然后通过ID2=2在示例表的第一部分将ID1=02链接到ID2=01,我知道这是我感兴趣的单个实体 是否可以从ID1创建一个复合
ID1 ID2
01 1
01 1
01 2
01 2
01 2
02 2
02 2
02 3
02 3
02 3
...
03 4
04 5
05 6
06 7
因为我可以通过ID1=02
将ID2=3
链接到ID2=2
,然后通过ID2=2
在示例表的第一部分将ID1=02
链接到ID2=01
,我知道这是我感兴趣的单个实体
是否可以从ID1创建一个复合键,这将表明这是一个单一实体,如:
ID1 ID2 ID_comp
01 1 01_02
01 1 01_02
01 2 01_02
01 2 01_02
01 2 01_02
02 2 01_02
02 2 01_02
02 3 01_02
02 3 01_02
02 3 01_02
03 4 03
04 5 04
05 6 05
06 7 06
这只是一个例子。在ID1和ID2中可能存在具有多个标识符的更长序列。还请注意,ID1的一些序列直接映射到ID2,如03、04、05、06。ID1和ID2都是全局唯一的字符串,但为了简单起见,我在这里使用了数字。还有一个时间戳列,通过它可以对记录进行排序
感谢您的帮助。下面是关于BigQuery标准SQL和使用BQ脚本功能的
DECLARE rows_count, run_away_stop INT64 DEFAULT 0;
CREATE TEMP TABLE buckets AS
SELECT ARRAY_AGG(id2 ORDER BY id2) arr
FROM `project.dataset.table`
GROUP BY id1;
LOOP
SET rows_count = (SELECT COUNT(1) FROM buckets);
SET run_away_stop = run_away_stop + 1;
CREATE OR REPLACE TEMP TABLE buckets AS
SELECT ANY_VALUE(arr) arr FROM (
SELECT ARRAY(SELECT DISTINCT val FROM UNNEST(arr) val ORDER BY val) arr
FROM (
SELECT ANY_VALUE(arr1) arr1, ARRAY_CONCAT_AGG(arr) arr
FROM (
SELECT t1.arr arr1, t2.arr arr2, ARRAY(SELECT DISTINCT val FROM UNNEST(ARRAY_CONCAT( t1.arr, t2.arr)) val ORDER BY val) arr
FROM buckets t1, buckets t2
WHERE (SELECT COUNT(1) FROM UNNEST(t1.arr) val JOIN UNNEST(t2.arr) val USING(val)) > 0
) GROUP BY FORMAT('%t', arr1)
)
) GROUP BY FORMAT('%t', arr);
IF (rows_count = (SELECT COUNT(1) FROM buckets) AND run_away_stop > 1) OR run_away_stop > 10 THEN BREAK; END IF;
END LOOP;
SELECT id1, id2,
ARRAY_TO_STRING(ARRAY(SELECT DISTINCT id FROM t.arr as id ORDER BY id), '_') ID_comp
FROM (
SELECT id1, id2, ARRAY_AGG(id1) OVER(PARTITION BY grp) arr
FROM input
JOIN (SELECT ROW_NUMBER() OVER() grp, arr FROM buckets)
ON id2 IN UNNEST(arr)
) t
-- ORDER BY id1, id2;
如果要将上述脚本应用于问题中的样本数据,则输出为
注意:要查看上面的结果,您需要单击脚本中最后一条语句的“查看结果”按钮-在运行脚本后,该按钮看起来与下面的类似
另请注意-您可以通过调整
run\u away\u stop>10来控制循环的收敛
-正如您现在看到的,只允许10次迭代-您可以根据需要增加它哇,非常感谢!这真的很有用。考虑接受和投票的答案:哦,对不起,忘了接受: