SQL筛选条件添加:如何获取仅在store_id 1消费的用户
解决思路与SQL写法
核心逻辑是:我们要找的是所有消费记录里只有store_id=1的用户,不是只筛选出在store_id=1消费过的记录——后者会包含那些同时在其他门店消费的用户,所以得从用户维度去判断。
这里给你几种实用的写法:
方法1:分组后通过聚合条件筛选
按用户分组,确保该用户的所有消费记录里,门店ID的最小值和最大值都是1(说明没有其他门店的记录):
SELECT user_id FROM your_consumption_table -- 替换成你的表名 GROUP BY user_id HAVING MIN(store_id) = 1 AND MAX(store_id) = 1;
如果门店ID可能有非数字的情况,也可以用COUNT(DISTINCT store_id) = 1 AND MIN(store_id) = 1,逻辑是一样的——用户只有唯一的门店记录,且这个门店是1。
方法2:子查询排除有其他门店消费的用户
先找出所有在store_id=1消费过的用户,再排除掉那些在其他门店有消费记录的用户:
SELECT DISTINCT user_id FROM your_consumption_table WHERE store_id = 1 AND user_id NOT IN ( SELECT user_id FROM your_consumption_table WHERE store_id != 1 );
如果你的表中有NULL值,NOT IN可能会有问题,这时候可以改用NOT EXISTS:
SELECT DISTINCT t1.user_id FROM your_consumption_table t1 WHERE t1.store_id = 1 AND NOT EXISTS ( SELECT 1 FROM your_consumption_table t2 WHERE t2.user_id = t1.user_id AND t2.store_id != 1 );
NOT EXISTS的性能通常比NOT IN更稳定,尤其是在数据量较大的时候。
方法3:LEFT JOIN过滤无其他门店记录的用户
通过左关联自身表,筛选出那些在其他门店没有匹配记录的用户:
SELECT DISTINCT t1.user_id FROM your_consumption_table t1 LEFT JOIN your_consumption_table t2 ON t1.user_id = t2.user_id AND t2.store_id != 1 WHERE t1.store_id = 1 AND t2.user_id IS NULL;
逻辑是:把在门店1消费的用户,和他们在其他门店的消费记录关联,关联不到(t2.user_id为NULL)的,就是没有其他门店消费的用户。
内容的提问来源于stack exchange,提问作者Eduardo Chacon
相关产品推荐
相关产品推荐

