选择独特的组合(双面独特)

时间:2018-09-18 21:53:45

标签: sql google-bigquery

编辑:向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 JOINDISTINCTARRAYWINDOW函数的哪种组合。

任何指导表示赞赏。

1 个答案:

答案 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 

SQL Fiddle