使用T-SQL筛选Runs逐次递增的记录
T-SQL解决方案:筛选逐次递增的赛事得分行
没问题,要解决这个筛选逐次递增得分的需求,咱们可以用T-SQL的窗口函数来轻松实现。首先明确需求:我们要找出所有得分是迄今为止历史最高分的行——也就是每一行的得分都比之前所有行的得分更高,直到出现第一个无法打破之前记录的行,之后的所有行都不再符合条件。
原始数据示例
先把你提供的赛事数据整理成结构化表格更清晰:
| Runs | Name | Opposition | Ground | Date | RN |
|---|---|---|---|---|---|
| 4 | Wickramanayake | Ellerslie | Devonport Domain | 25-26/11/2016 | 1 |
| 51 | Mahoney | Ellerslie | Devonport Domain | 25-26/11/2016 | 2 |
| 157 | Beghin | Ellerslie | Devonport Domain | 25-26/11/2016 | 3 |
| 10 | Olsen | Ellerslie | Devonport Domain | 25-26/11/2016 | 4 |
| 9 | Thomson | Ellerslie | Devonport Domain | 25-26/11/2016 | 5 |
| 12 | Chitongo | Ellerslie | Devonport Domain | 25-26/11/2016 | 6 |
| ... | ... | ... | ... | ... | ... |
实现代码
假设你的赛事数据存储在名为MatchScores的表中,我们可以用CTE(公共表表达式)结合窗口函数MAX() OVER()来计算累积最大值,再筛选符合条件的行:
WITH CumulativeMaxScores AS ( SELECT Runs, Name, Opposition, Ground, Date, RN, -- 计算从第一行到当前行的累积最大得分 MAX(Runs) OVER ( ORDER BY RN ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS CumulativeMaxRun FROM MatchScores ) SELECT Runs, Name, Opposition, Ground, Date, RN FROM CumulativeMaxScores WHERE Runs = CumulativeMaxRun ORDER BY RN;
代码解释
- 累积最大值计算:
MAX(Runs) OVER (...)会按照RN(得分记录的顺序),逐行计算从第一行到当前行的最大得分值。比如第三行的累积最大值是157,第四行到后续所有行的累积最大值都会保持157,因为没有更高的得分出现。 - 筛选条件:
WHERE Runs = CumulativeMaxRun会只保留那些得分等于当前累积最大值的行——也就是每一次打破历史记录的行,正好对应你需要的前三行(4、51、157)。 - 排序说明:如果
RN不是记录的先后顺序标识,你可以替换成Date或者其他能代表得分出现顺序的字段,确保计算累积最大值的逻辑正确。
执行这段代码后,结果集就会仅包含得分逐次递增的前三行记录。
内容的提问来源于stack exchange,提问作者Blair
相关产品推荐
相关产品推荐

