Google bigquery 使用BigQuery SQL语法匹配记录

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,记录如下所示:

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次迭代-您可以根据需要增加它

哇,非常感谢!这真的很有用。考虑接受和投票的答案:哦,对不起,忘了接受: