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

时间:2016-01-10 14:47:33

标签: sql google-bigquery

道歉,这肯定是重复的,但我不知道google的正确用词。

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

org_id    item_id    spend
--------------------------
123        AAB         2
123        AAC         4
124        AAB        10
124        AAD         5

我想找到仅由三个或更少组织购买的所有商品。然后我想通过总计支出来订购它们。

我如何在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

2 个答案:

答案 0 :(得分:4)

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

请注意,在BigQuery中:

  

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

     

要计算不同值的确切数量,请使用   EXACT_COUNT_DISTINCT。或者,对于更具可扩展性的方法,请考虑使用   在相关字段上分组EACH BY,然后应用COUNT(*)。该   GROUP EACH BY方法更具可扩展性,但可能会产生轻微影响   前期性能损失。

https://cloud.google.com/bigquery/query-reference#aggfunctions

的语法部分中查看有关COUNT和DISTINCT的更多信息

答案 1 :(得分:0)

您的SQL品牌可能略有不同,但这是您在SQL Server中的方式:

Select item_id, sum(spend) as total_spent, count(distinct org_id) as num_orgs
from myTable
group by item_id
having num_orgs <= 3
order by total_spend desc