SQL Server:如何统计列唯一值数量及各值的平均分数?
解决你的SQL统计问题
我明白你想要按城市统计两个核心指标:唯一ID的数量和所有metric值的平均分数,你的原始SQL因为逻辑偏差导致结果不对,我来帮你修正。
问题拆解
从你的示例数据和期望结果来看:
city_count_unique:是每个城市下不同id的数量(比如Berlin有1a、1b两个唯一ID,所以值为2)average_metric_score:是该城市所有metric_value的总和除以总metric记录数(比如Berlin的总和是1+2+3+4+5+3=18,总记录数6,18/6=3)
原始SQL的问题
你的子查询SELECT DISTINCT metric_value, city FROM dbo.Table存在两个关键错误:
- 错误去重数据:比如Berlin的
comments=3出现了两次,会被合并成一条,导致后续计算的平均值和计数都不准确 - 未利用
id统计唯一ID:原SQL里的COUNT(*)统计的是去重后的metric_value+city组合数,完全不是你需要的唯一ID数量
正确的SQL语句
下面的语句可以准确得到你想要的结果:
SELECT city, COUNT(DISTINCT id) AS city_count_unique, -- *1.0是为了避免整数除法问题,确保结果是浮点数 SUM(metric_value) * 1.0 / COUNT(*) AS average_metric_score FROM dbo.Table GROUP BY city;
你也可以直接用AVG(metric_value),效果完全一致(因为AVG本质就是总和除以记录数):
SELECT city, COUNT(DISTINCT id) AS city_count_unique, AVG(metric_value) AS average_metric_score FROM dbo.Table GROUP BY city;
结果验证
针对你的示例数据:
- Berlin的
COUNT(DISTINCT id)是2,SUM(metric_value)*1.0/COUNT(*)是18/6=3 - Hamburg的
COUNT(DISTINCT id)是2,SUM(metric_value)*1.0/COUNT(*)是17/6≈2.8
完全匹配你期望的结果。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

