![](/img/trans.png)
[英]How to find for each of the top 3 returned value from one column, the 3 top values from another column?
[英]Fetch values from another table for each column written in an array for each ID
我有一個看起來像這樣的數據集
select 'Alice' AS ID, 2 AS col1, 5 AS col2, 6 AS col3, 0 AS col4
union all
select 'Bob' AS ID, 1 AS col1, 4 AS col2, -2 AS col3, 7 AS col4
和一個看起來像這樣的數據集。 這為每個 ID 提供了一個重要列的列表
select 'Alice' AS ID, [STRUCT('col1' AS column, 1 AS rank), STRUCT('col4' AS column, 2 AS rank), STRUCT('col3' AS column, 3 AS rank)] AS important_columns
union all
select 'Bob' AS ID, [STRUCT('col4' AS column, 1 AS rank), STRUCT('col2' AS column, 2 AS rank), STRUCT('col1' AS column, 3 AS rank)]
我想為 sample_data_1 中的每個 ID 添加重要列的值
所以我可以有一個看起來像這樣的 output
select 'Alice' AS ID, [STRUCT('col1' AS column, 1 AS rank, 2 AS value), STRUCT('col4' AS column, 2 AS rank, 0 AS value), STRUCT('col3' AS column, 3 AS rank, 6 AS value)] AS important_columns
union all
select 'Bob' AS ID, [STRUCT('col4' AS column, 1 AS rank, 7 AS value), STRUCT('col2' AS column, 2 AS rank, 4 AS value), STRUCT('col1' AS column, 3 AS rank, 1 AS value)]
我希望代碼是動態的,因此即使列名更改或列數更改也能正常工作
考慮以下查詢。
EXECUTE IMMEDIATE FORMAT("""
CREATE TEMP TABLE sample_data1_unpivoted AS
SELECT ID, ARRAY_AGG(STRUCT(column, value)) outputs FROM sample_data1 UNPIVOT (value FOR column IN (%s)) GROUP BY 1
""", ARRAY_TO_STRING(
REGEXP_EXTRACT_ALL(TO_JSON_STRING((SELECT AS STRUCT * EXCEPT (ID) FROM sample_data1 LIMIT 1)), r'"([^,{]+)":'), ',')
);
SELECT ID, ARRAY (
SELECT AS STRUCT column, rank, value
FROM t1.important_columns LEFT JOIN t2.outputs USING (column)
) important_columns
FROM sample_data2 t1
LEFT JOIN sample_data1_unpivoted t2 USING (ID);
查詢結果
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.