BigQuery 对两列使用 Group By 函数,顺序无关紧要
Posted
技术标签:
【中文标题】BigQuery 对两列使用 Group By 函数,顺序无关紧要【英文标题】:BigQuery using a Group By function for two columns, order does not matter 【发布时间】:2020-01-28 05:53:29 【问题描述】:我正在尝试在此表上进行分组,使其如下所示。
之前
Student Fruit 1 Fruit 2
Tom Apple Banana
Tom Banana Apple
Gary Apple Banana
之后
Student Fruit 1 Fruit 2 Count Repeated Condition
Tom Apple Banana 2 True
Gary Apple Banana 1 False
有人知道如何在 Google BigQuery 上轻松实现这一点吗?顺序无所谓。我尝试过 String_AGG 和 Concat 函数,但顺序很重要。
试图创建一个试图创建第二个表的函数。
【问题讨论】:
Repeated Condition
是如何生成的?
如果计数 >1 则为真否则为假
那么Count
算什么?
他以不同顺序食用苹果和香蕉的那排汤姆
【参考方案1】:
您可以使用LEAST
和GREATEST
将两列中的水果按字母顺序排序,然后对这些排序值进行分组:
SELECT Student,
LEAST(Fruit1, Fruit2) AS Fruit1,
GREATEST(Fruit1, Fruit2) AS Fruit2,
COUNT(*) AS Count,
CASE WHEN COUNT(*) > 1 THEN 'True' ELSE 'False' END AS "Repeated Condition"
FROM fruits
GROUP BY Student, LEAST(Fruit1, Fruit2), GREATEST(Fruit1, Fruit2)
输出:
student fruit1 fruit2 count Repeated Condition
Tom Apple Banana 2 True
Gary Apple Banana 1 False
【讨论】:
【参考方案2】:这是一种选择,它使用最小/最大技巧来获得您想要的报告:
SELECT
Student,
LEAST(fruit1, fruit2) AS fruit1,
GREATEST(fruit1, fruit2) AS fruit2,
COUNT(*) AS cnt,
CASE WHEN LEAST(fruit1) <> GREATEST(fruit1)
THEN 'True' ELSE 'False' END AS "Repeated Condition"
FROM yourTable
GROUP BY
Student,
LEAST(fruit1, fruit2),
GREATEST(fruit1, fruit2)
这里的想法是按学生汇总任何两个水果的较小/较大值。这使(Apple, Banana)
与(Banana, Apple)
保持一致。然后,如果在给定的学生/水果组中,我们可以检测到水果的顺序在任何地方都不相同,我们会报告 True
的重复条件。否则,我们报告False
。
【讨论】:
以上是关于BigQuery 对两列使用 Group By 函数,顺序无关紧要的主要内容,如果未能解决你的问题,请参考以下文章
BIGQUERY 中的 COUNT() 和 GROUP BY
BigQuery GROUP BY/GROUP EACH BY 资源超出错误,但查询不包含 GROUP BY 运算符
GROUP by 查询(三元组)的 BigQuery 内部错误