编辑:向Fiddle添加了链接,以获取更全面的示例(实际数据集)
我想知道在SQL
中,尤其是在BigQuery
中,以及在一个SELECT
语句中,以下内容是否可行。
考虑以下输入:
Key | Value
-----|-------
a | 2
a | 3
b | 2
b | 3
b | 5
c | 2
c | 5
c | 7
逻辑:为每个键选择最低的“可用”值。可用含义尚未分配/使用。见下文。
Key | Value | Rule
-----|-------|--------------------------------------------
a | 2 | keep
a | 3 | ignore because key "a" has a value already
b | 2 | ignore because value "2" was already used
b | 3 | keep
b | 5 | ignore because key "b" has a value already
c | 2 | ignore because value "2" was already used
c | 5 | keep
c | 7 | ignore because key "c" has a value already
因此预期结果:
Key | Value
-----|-------
a | 2
b | 3
c | 5
这里是创建虚拟表的SQL:
with t as ( select
'a' key, 2 value UNION ALL select 'a', 3
UNION ALL select 'b', 2 UNION ALL select 'b', 3 UNION ALL select 'b', 5
UNION ALL select 'c', 2 UNION ALL select 'c', 5 UNION ALL select 'c', 7
)
select * from t
编辑:这里是另外一个dataset
不确定我可以使用FULL JOIN
,DISTINCT
,ARRAY
或WINDOW
函数的哪种组合。
任何指导表示赞赏。
答案 0 :(得分:1)
编辑:这是一个不正确的答案,该答案适用于原始示例数据集,但存在问题(如综合示例所示)。我现在将其保留在此处以保留评论历史记录。
我没有特定的BigQuery
答案,但这是一个使用Common Table Expression和递归的SQL
解决方案。
WITH MyCTE AS
(
/* ANCHOR SUBQUERY */
SELECT MyKey, MyValue
FROM MyTable t
WHERE t.MyKey = (SELECT MIN(MyKey) FROM MyTable)
UNION ALL
/* RECURSIVE SUBQUERY */
SELECT t.MyKey, t.MyValue
FROM MyTable t
INNER JOIN MyCTE c
ON c.MyKey < t.MyKey
AND c.MyValue < t.MyValue
)
SELECT MyKey, MIN(MyValue)
FROM MyCTE
GROUP BY MyKey
;
结果:
Key | Value
-----|-------
a | 2
b | 3
c | 5