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

求每个PRODUCT的去重USER_ID数及按TYPE分组的去重USER_ID数(SQL)

用窗口函数实现产品维度的去重用户统计(含全局与分类)

需求说明

现有表包含USER_ID、TYPE、PRODUCT三列,存在重复行。需完成以下统计:

  • 每个PRODUCT对应的去重USER_ID总数
  • 每个PRODUCT下各TYPE对应的去重USER_ID数
    要求仅使用窗口函数,禁止使用JOIN/UNION操作。

示例输入

USER_IDTYPEPRODUCT
11111AdidasShirt
11111AdidasShirt
11111NikeShirt
22222NikeShirt
11111AdidasShort
22222NikeShort
22222PumaShort

期望输出

PRODUCTTYPECOUNT
Shirt-2
ShirtAdidas1
ShirtNike2
Short-2
ShortAdidas1
ShortNike1
ShortPuma1

解决方案

SELECT DISTINCT
    PRODUCT,
    CASE WHEN rn = 1 THEN '-' ELSE TYPE END AS TYPE,
    CASE WHEN rn = 1 THEN product_user_count ELSE type_user_count END AS COUNT
FROM (
    SELECT
        PRODUCT,
        TYPE,
        COUNT(DISTINCT USER_ID) OVER (PARTITION BY PRODUCT) AS product_user_count,
        COUNT(DISTINCT USER_ID) OVER (PARTITION BY PRODUCT, TYPE) AS type_user_count,
        ROW_NUMBER() OVER (PARTITION BY PRODUCT ORDER BY TYPE) AS rn
    FROM your_table_name
) t
ORDER BY PRODUCT, TYPE;

思路解析

  1. 内层子查询:
    • 用COUNT(DISTINCT USER_ID) OVER (PARTITION BY PRODUCT)计算每个产品的去重用户总数,存入product_user_count
    • 用COUNT(DISTINCT USER_ID) OVER (PARTITION BY PRODUCT, TYPE)计算每个产品下各类型的去重用户数,存入type_user_count
    • 用ROW_NUMBER() OVER (PARTITION BY PRODUCT ORDER BY TYPE)给每个产品下的记录排序,标记出每个产品的第一条记录(rn=1)
  2. 外层查询:
    • 通过DISTINCT去除原表重复行带来的重复统计结果
    • 用CASE语句将每个产品的第一条记录的TYPE替换为-,并使用全局统计值product_user_count,其余行保留原TYPE和分类统计值type_user_count
    • 最后按PRODUCT和TYPE排序,匹配期望输出的顺序

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:52:48