如何在 SQL 中获取 GROUP BY 后面不同的计数?

Ric*_*ard 3 sql google-bigquery

抱歉,这肯定是重复的,但我不知道谷歌搜索的正确词。

我有一个购买决策表,如下所示:

org_id    item_id    spend
--------------------------
123        AAB         2
123        AAC         4
124        AAB        10
124        AAD         5
Run Code Online (Sandbox Code Playgroud)

我想找到仅由三个或更少组织购买的所有物品。然后我想按总支出对它们进行排序。

我将如何在 SQL 中执行此操作?注意我正在使用BigQuery SQL

到目前为止我已经得到:

SELECT * 
FROM 
  (SELECT ??(org_id) as org_count, -- How do I get the count of different org_ids? 
         item_id, 
         SUM(spend) AS total_spend
  FROM mytable 
  GROUP BY item_id) t
WHERE org_count < 4
ORDER BY total_spend DESC
Run Code Online (Sandbox Code Playgroud)

Mik*_*ant 7

SELECT 
  item_id, 
  EXACT_COUNT_DISTINCT(org_id) AS org_count, 
  SUM(spend) AS total_spent
FROM mytable
GROUP BY item_id
HAVING org_count < 4
ORDER BY total_spend DESC
Run Code Online (Sandbox Code Playgroud)

请注意,在 BigQuery 中:

如果将 COUNT 与 DISTINCT 关键字一起使用,则该函数将返回指定字段的不同值的数量。请注意,DISTINCT 的返回值是统计近似值,不能保证准确。

要计算不同值的确切数量,请使用 EXACT_COUNT_DISTINCT。或者,为了获得更具可扩展性的方法,请考虑对相关字段使用 GROUP EACH BY,然后应用 COUNT(*)。GROUP EACH BY 方法更具可扩展性,但可能会导致轻微的前期性能损失。

有关 COUNT 和 DISTINCT 的更多信息,请参阅https://cloud.google.com/bigquery/query-reference#aggfunctions的语法部分