如何统计逗号分隔字段的字符出现次数并按计数降序排序
实现逻辑
整体分为三步完成:
- 拆分每行
COL_IN字段的逗号分隔值,得到单个独立元素 - 解析每个元素的统计规则:带数字前缀的元素(如
2K)提取数字作为计数、字母作为统计项;无数字前缀的元素(如E、O)默认计数为1 - 按统计项分组求和,最终按总计数降序排序
主流数据库实现示例
以下代码请将你的表名替换为实际表名使用。
PostgreSQL 版本
WITH split_elements AS ( -- 拆分逗号分隔字符串,去除元素前后空格 SELECT TRIM(UNNEST(STRING_TO_ARRAY(col_in, ','))) AS elem FROM 你的表名 ), parsed_elements AS ( SELECT -- 提取字母部分作为输出字段 REGEXP_REPLACE(elem, '\d*', '') AS col_out, -- 提取数字部分,无数字默认计数为1 COALESCE(NULLIF(REGEXP_REPLACE(elem, '\D*', ''), '')::INT, 1) AS cnt FROM split_elements ) -- 分组聚合排序 SELECT col_out, SUM(cnt) AS COUNT FROM parsed_elements GROUP BY col_out ORDER BY COUNT DESC;
MySQL 8.0+ 版本
WITH split_elements AS ( -- 拆分逗号分隔字符串,去除元素前后空格 SELECT TRIM(j.elem) AS elem FROM 你的表名 t JOIN JSON_TABLE( CONCAT('["', REPLACE(t.col_in, ',', '","'), '"]'), '$[*]' COLUMNS(elem VARCHAR(10) PATH '$') ) j ), parsed_elements AS ( SELECT -- 提取字母部分作为输出字段 REGEXP_REPLACE(elem, '[0-9]', '') AS col_out, -- 提取数字部分,无数字默认计数为1 IF(REGEXP_LIKE(elem, '^[0-9]'), CAST(REGEXP_REPLACE(elem, '[^0-9]', '') AS UNSIGNED), 1) AS cnt FROM split_elements ) -- 分组聚合排序 SELECT col_out, SUM(cnt) AS `COUNT` FROM parsed_elements GROUP BY col_out ORDER BY `COUNT` DESC;
如果使用不支持CTE和JSON_TABLE的低版本MySQL,可通过自定义拆分函数、存储过程实现相同逻辑,核心处理规则不变。
内容的提问来源于stack exchange,提问作者banana_99
相关产品推荐
相关产品推荐

