我有一个像db这样的数据库:
+---+-------------+----------
|id | customer_id | store_id|
+---+-------------+----------
|1 | 1 | 1001|
|2 | 1 | 1002|
|3 | 1 | 1001|
|4 | 1 | 1003|
|5 | 2 | 1001|
|6 | 2 | 1001|
|7 | 3 | 1001|
|8 | 3 | 1002|
|9 | 3 | 1001|
|10 | 4 | 1003|
|11 | 4 | 1001|
|12 | 4 | 1002|
+---+-------------+----------
我希望计算不同的customer_id,其中购物不同shop_id超过值1.(对于exp.customer_id 1购物1001,1002和customer_id 4购物1001,1002,1003和customer_id 3购物1001,1002但是customer_id 2只购物1001)
答案 0 :(得分:1)
您可以使用嵌套查询 - 内部查询只过滤具有多个商店ID的客户ID,而外部查询则计算它们:
SELECT COUNT(*)
FROM (SELECT customer_id
FROM my_table
GROUP BY customer_id
HAVING COUNT(DISTINCT store_id) > 1) t
请注意,内部查询中的group by
已经返回不同的客户ID,因此外部查询在其distinct
调用中不需要count
。
答案 1 :(得分:0)
使用子查询为每个customer_id计算store_id,并计算该计数超过一个的行
SELECT COUNT(*)
FROM (SELECT count(*) cnt
FROM my_table
GROUP BY customer_id
) t
WHERE cnt > 1
答案 2 :(得分:0)
这是一种只有一级聚合的方法:
select count(distinct customer_id)
from t
where exists (select 1
from t t2
where t2.customer_id = t.customer_id and
t2.store_id <> t.store_id
);
此查询应该能够利用t(customer_id, store_id)
上的索引,这可能会为其带来性能优势。