如何在SQL数据集中统计拥有相同技能组合的用户分组及人数?
解决步骤
1. SQL统计技能组合及用户数
首先要把每个用户的技能拼接成唯一的组合字符串,再按该字符串分组统计用户数量。以下是不同SQL方言的实现:
MySQL/MariaDB
SELECT GROUP_CONCAT(Skill ORDER BY Skill SEPARATOR ' & ') AS skill_combination, COUNT(DISTINCT User) AS user_count FROM your_table_name GROUP BY skill_combination ORDER BY user_count DESC;
PostgreSQL
SELECT STRING_AGG(Skill::TEXT, ' & ' ORDER BY Skill) AS skill_combination, COUNT(DISTINCT "User") AS user_count FROM your_table_name GROUP BY skill_combination ORDER BY user_count DESC;
SQL Server
SELECT skill_combination, COUNT(DISTINCT "User") AS user_count FROM ( SELECT "User", STUFF(( SELECT ' & ' + Skill FROM your_table_name t2 WHERE t2."User" = t1."User" ORDER BY Skill FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 3, '') AS skill_combination FROM your_table_name t1 GROUP BY "User" ) AS user_skills GROUP BY skill_combination ORDER BY user_count DESC;
说明:ORDER BY Skill是为了让技能顺序不同的相同组合(比如1&2和2&1)被视为同一组,避免重复统计。
2. 生成指定格式的输出
如果需要直接生成类似Group A {Skills: 1 & 2 & 7} 有10人的格式,可以用脚本处理SQL查询结果:
Python处理示例
假设已将SQL结果导出为CSV文件(列名:skill_combination, user_count),执行以下代码:
import csv with open('skill_groups.csv', 'r', encoding='utf-8') as f: reader = csv.DictReader(f) groups = sorted(reader, key=lambda x: int(x['user_count']), reverse=True) for idx, group in enumerate(groups, 1): print(f"Group {chr(64+idx)} {{Skills: {group['skill_combination']}}} 有{group['user_count']}人")
3. 可视化方案
由于技能组合可能数量较多,建议优先展示用户数量排名靠前的组合,避免图表拥挤:
条形图(Python + Matplotlib)
import matplotlib.pyplot as plt import pandas as pd # 读取数据,取前10个用户数最多的组合 df = pd.read_csv('skill_groups.csv') top_groups = df.nlargest(10, 'user_count') plt.figure(figsize=(12, 6)) plt.barh(top_groups['skill_combination'], top_groups['user_count'], color='#4CAF50') plt.xlabel('用户数量') plt.ylabel('技能组合') plt.title('技能组合对应的用户数量排名(Top 10)') plt.gca().invert_yaxis() # 让数量多的组合显示在上方 plt.show()
无代码工具方案
如果不想写代码,可使用Tableau、Power BI或Excel:
- 将SQL查询结果导入工具
- 选择技能组合作为维度,用户数量作为度量
- 生成条形图、树状图或气泡图,直观展示不同组合的用户规模
内容的提问来源于stack exchange,提问作者Rich Kramp
相关产品推荐
相关产品推荐

