我有一张购买决策表,如下所示:
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
答案 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