SQL查询需求:按日期计算每日数据有效性百分比
按日期计算每日有效性百分比的正确SQL写法
看起来你已经揪出了问题的核心——之前的子查询没按日期做过滤,导致统计的是全表的有效记录,而非对应日期的。我来帮你修正这个问题,同时给你两种好用的实现方式:
先明确你的数据源:
date time validity --------------------------- Day1 07:00 valid Day1 15:00 valid Day1 23:00 invalid Day2 07:00 valid Day2 15:00 valid Day2 23:00 valid Day3 07:00 invalid Day3 15:00 invalid Day3 23:00 invalid
方法一:用CASE WHEN聚合统计(推荐)
这种方法只需要扫描一次表,效率更高:
SELECT date, ROUND( (SUM(CASE WHEN validity = 'valid' THEN 1 ELSE 0 END) * 100.0 / COUNT(*)) ) AS percentage FROM myTable GROUP BY date;
逻辑拆解:
SUM(CASE WHEN validity = 'valid' THEN 1 ELSE 0 END):针对每个日期,统计其中标记为valid的记录数量COUNT(*):获取该日期的总记录数- 乘以
100.0是为了触发浮点运算(避免整数除法导致的精度丢失),最后用ROUND取整得到整数百分比
方法二:修正你的关联子查询
如果你想保留子查询的写法,只需要给子查询加上日期关联条件,让它只统计当前分组日期的有效记录:
SELECT date, ROUND( (SELECT COUNT(*) FROM myTable t2 WHERE t2.date = t1.date AND t2.validity = 'valid') * 100.0 / COUNT(*) ) AS percentage FROM myTable t1 GROUP BY date;
逻辑拆解:
- 给主表起别名
t1,子查询里的t2.date = t1.date是关键——它确保子查询只统计和当前分组日期一致的valid记录,而不是全表的
为什么你的原查询会出错?
你的原查询里,子查询(SELECT Count(validity) From myTable WHERE validity= 'valid')没有任何日期过滤条件,所以不管分组到Day1还是Day3,这个子查询返回的都是全表所有valid记录的总数(也就是4条),自然算不出正确的每日百分比。
这两种方法运行后,都会得到你想要的预期结果:
| date | percentage |
|---|---|
| Day1 | 66 |
| Day2 | 100 |
| Day3 | 0 |
内容的提问来源于stack exchange,提问作者Azizul H
相关产品推荐
相关产品推荐

