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】:

您可以使用LEASTGREATEST 将两列中的水果按字母顺序排序,然后对这些排序值进行分组:

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

Google BigQuery GROUP BY 超时

BigQuery GROUP BY/GROUP EACH BY 资源超出错误,但查询不包含 GROUP BY 运算符

GROUP by 查询(三元组)的 BigQuery 内部错误

google bigquery SQL group by 聚合函数

如何在 django 中将两列与 group by 相乘和求和