WHERE语句放置位置咨询及基于日期的累计百分比SQL实现
解决你的SQL累计百分比计算问题
我明白你要做的是:针对tblTourns_atp里的每一行,计算同一个ID_Ti分组下,日期小于等于当前行日期的所有记录中,FS_1总和占FSOF_1总和的百分比,对吧?下面给你两种可行的方案,重点说明WHERE语句的放置位置:
方案一:使用关联子查询(符合你提到的WHERE语句需求)
这种方法里,WHERE语句是放在子查询内部的,用来限定当前行所属的ID_Ti分组,同时筛选出该分组内日期不晚于当前行的记录,从而计算累计总和。
SELECT t.ID_T, t.ID_Ti, t.DATE, -- 计算累计百分比,保留整数位 ROUND( -- 子查询1:同ID_Ti且日期<=当前行的FS_1总和 (SELECT SUM(s2.FS_1) FROM tblTourns_atp t2 INNER JOIN stat_atp s2 ON t2.ID_T = s2.ID_T WHERE t2.ID_Ti = t.ID_Ti AND t2.DATE <= t.DATE) / -- 子查询2:同ID_Ti且日期<=当前行的FSOF_1总和 (SELECT SUM(s2.FSOF_1) FROM tblTourns_atp t2 INNER JOIN stat_atp s2 ON t2.ID_T = s2.ID_T WHERE t2.ID_Ti = t.ID_Ti AND t2.DATE <= t.DATE) * 100, 0 ) AS OUTPUT FROM tblTourns_atp t INNER JOIN stat_atp s ON t.ID_T = s.ID_T ORDER BY t.ID_Ti, t.DATE;
关键说明:
- 两个子查询里的
WHERE分别关联了外部查询的t.ID_Ti和t.DATE,确保只计算当前行所在分组内、日期不晚于当前行的记录总和。 - 用
ROUND()函数把百分比保留到整数位,和你给出的示例输出格式一致。
方案二:使用窗口函数(更高效,无需额外WHERE)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),这种方法性能更好,不需要写嵌套的子查询,直接通过窗口的分区和排序实现累计计算:
SELECT t.ID_T, t.ID_Ti, t.DATE, ROUND( -- 按ID_Ti分组,按日期排序,累计计算FS_1总和 SUM(s.FS_1) OVER (PARTITION BY t.ID_Ti ORDER BY t.DATE) / -- 同样的窗口范围,累计计算FSOF_1总和 SUM(s.FSOF_1) OVER (PARTITION BY t.ID_Ti ORDER BY t.DATE) * 100, 0 ) AS OUTPUT FROM tblTourns_atp t INNER JOIN stat_atp s ON t.ID_T = s.ID_T ORDER BY t.ID_Ti, t.DATE;
关键说明:
PARTITION BY t.ID_Ti表示按ID_Ti分组计算,ORDER BY t.DATE让窗口函数默认从分组的第一条记录累计到当前行(等价于ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),自动实现了“日期<=当前行”的筛选逻辑,不需要额外写WHERE。
这两种方法都能得到你示例中的OUTPUT结果,你可以根据自己的数据库版本和数据量选择合适的方案。
内容的提问来源于stack exchange,提问作者Jossy
相关产品推荐
相关产品推荐

