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

如何使用纯SQL统计test表逗号分隔my_list字段的去重值数量

问题原因

你写的SQL是直接对my_list整字段去重计数,没有拆分字段内的逗号分隔元素,因此无法统计字段内部的去重元素数量。

实现思路

核心逻辑是先将每行的my_list字段按逗号拆分为独立元素行,对元素去重后再按id分组统计数量,空值特殊处理返回0。

不同数据库实现方案

1. MySQL 8.0+ 版本

WITH RECURSIVE split_cte AS (
    SELECT 
        id,
        my_list,
        1 AS start_pos,
        IF(LOCATE(',', my_list) > 0, LOCATE(',', my_list), LENGTH(my_list) + 1) AS end_pos
    FROM test
    UNION ALL
    SELECT 
        id,
        my_list,
        end_pos + 1 AS start_pos,
        IF(LOCATE(',', my_list, end_pos + 1) > 0, LOCATE(',', my_list, end_pos + 1), LENGTH(my_list) + 1) AS end_pos
    FROM split_cte
    WHERE start_pos <= LENGTH(my_list)
)
SELECT 
    t.id,
    COUNT(DISTINCT TRIM(SUBSTRING(t.my_list, s.start_pos, s.end_pos - s.start_pos))) AS my_count
FROM test t
LEFT JOIN split_cte s ON t.id = s.id
GROUP BY t.id;

2. PostgreSQL 版本

SELECT 
    id,
    COALESCE(COUNT(DISTINCT TRIM(elem)), 0) AS my_count
FROM test
LEFT JOIN LATERAL UNNEST(STRING_TO_ARRAY(my_list, ',')) elem ON TRUE
GROUP BY id;

3. Hive/Spark SQL 版本

SELECT 
    id,
    COALESCE(COUNT(DISTINCT TRIM(elem)), 0) AS my_count
FROM test
LATERAL VIEW OUTER EXPLODE(SPLIT(my_list, ', ')) tmp AS elem
GROUP BY id;

以上方案均兼容空值场景,返回结果完全匹配预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 13:36:08