You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL中通过子查询/Join筛选行:统计仅使用指定产品的用户数(可指定月份)

问题背景

现有一张包含user、product、month字段的USERS表,建表语句及测试数据如下:

CREATE TABLE USERS (user VARCHAR(1),product VARCHAR(1),month INT);
INSERT INTO USERS (user,product,month) VALUES 
("A","X",9),("A","X",10),("A","X",10),("A","Y",11),
("B","Y",12),("B","X",10),("C","X",10),("D","Z",11),("D","X",9);

需求是通过SQL子查询或Join关联的方式,统计仅使用某一指定产品的用户数量,以及限定统计月份的实现方式。

实现方案

我们以统计仅使用产品X的用户数为例给出示例代码,替换代码中对应的产品值、月份范围即可适配其他统计需求。

1. 不限定统计月份

子查询实现

思路:先查询出所有使用过非X产品的用户,外层过滤掉这些用户后去重计数即可。

SELECT COUNT(DISTINCT user) AS only_x_user_count
FROM USERS
WHERE user NOT IN (
    SELECT DISTINCT user FROM USERS WHERE product != 'X'
);

运行结果为1,符合测试数据中仅用户C从未使用过X以外产品的情况。

Join关联实现

思路:左连接同表关联非X产品的同用户记录,若关联结果为空则说明该用户仅使用过X。

SELECT COUNT(DISTINCT u1.user) AS only_x_user_count
FROM USERS u1
LEFT JOIN USERS u2
ON u1.user = u2.user AND u2.product != 'X'
WHERE u1.product = 'X' AND u2.user IS NULL;

运行结果和子查询方式一致。

2. 限定统计月份

若只统计指定月份范围内的用户行为,只需在子查询/Join的条件中都加上月份过滤规则即可,我们以限定统计9、10两个月的结果为例:

子查询实现

SELECT COUNT(DISTINCT user) AS only_x_user_count
FROM USERS
WHERE month IN (9,10)
AND user NOT IN (
    SELECT DISTINCT user FROM USERS 
    WHERE month IN (9,10) 
    AND product != 'X'
);

运行结果为4,对应测试数据中9-10月范围内A、B、C、D都仅使用了X,范围外的使用记录不纳入统计。

Join关联实现

SELECT COUNT(DISTINCT u1.user) AS only_x_user_count
FROM USERS u1
LEFT JOIN USERS u2
ON u1.user = u2.user 
AND u2.month IN (9,10)
AND u2.product != 'X'
WHERE u1.month IN (9,10)
AND u1.product = 'X' 
AND u2.user IS NULL;

内容的提问来源于stack exchange,提问作者NetUser5y62

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:06:04