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

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条),自然算不出正确的每日百分比。

这两种方法运行后,都会得到你想要的预期结果:

datepercentage
Day166
Day2100
Day30

内容的提问来源于stack exchange,提问作者Azizul H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 00:43:16