【问题标题】:BigQuery using a Group By function for two columns, order does not matterBigQuery 对两列使用 Group By 函数,顺序无关紧要
【发布时间】: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 算什么?
  • 他以不同顺序食用苹果和香蕉的那排汤姆

标签: javascript sql google-apps-script google-bigquery


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      • 2015-10-29
      相关资源
      最近更新 更多