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

SQL优化:统计各设备组下拥有多设备组的用户数量实现方案

需求说明

按device_grp分组,统计每个设备组中拥有超过1个不同设备组的用户数量。

示例说明

  • android分组下,user_id为1和3的用户拥有大于1个不同设备组
  • iOS分组下,user_id为2、3、4的用户拥有大于1个不同设备组
  • fireTV分组下,user_id为1、2的用户拥有大于1个不同设备组

原始数据表

*----------------------*
|user_id | device_grp  |
*----------------------*
|    1   |    android  |
|    1   |    fireTV   |  
|    2   |    iOS      |
|    2   |    fireTV   |
|    3   |    android  |
|    3   |    iOS      |
|    4   |    web-play |
|    4   |    iOS      |
|    5   |    android  |
*----------------------*

预期结果

*--------------------------------------*
| device_group | users >1 device_grp   |
*--------------------------------------*
|   android    |    2                  |
|   iOS        |    3                  |
|   fireTV     |    2                  |
|   web-play   |    1                  |
*--------------------------------------*

更优实现方案

方案1:CTE关联写法(可读性优先)

先筛选出拥有多设备组的用户,再关联原始表按设备组统计数量,逻辑清晰易维护,适合小数据量场景:

WITH multi_device_users AS (
    -- 先找出所有拥有超过1个设备组的用户
    SELECT user_id
    FROM your_table
    GROUP BY user_id
    HAVING COUNT(DISTINCT device_grp) > 1
)
SELECT 
    t.device_grp AS device_group,
    COUNT(DISTINCT t.user_id) AS [users >1 device_grp]
FROM your_table t
INNER JOIN multi_device_users m ON t.user_id = m.user_id
GROUP BY t.device_grp

方案2:窗口函数写法(性能优先)

仅需一次全表扫描,无需表关联,性能更高,适合百万级以上大数据量场景:

SELECT 
    device_grp AS device_group,
    COUNT(DISTINCT user_id) AS [users >1 device_grp]
FROM (
    SELECT 
        user_id,
        device_grp,
        -- 窗口函数统计每个用户对应的设备组数量
        COUNT(DISTINCT device_grp) OVER(PARTITION BY user_id) AS grp_total
    FROM your_table
) t
WHERE grp_total > 1
GROUP BY device_grp

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:36:02