如何使用窗口函数检查特定范围值是不是填充在 SQL 中?
Posted
技术标签:
【中文标题】如何使用窗口函数检查特定范围值是不是填充在 SQL 中?【英文标题】:How to check a specific range value is filled in SQL with Window functions?如何使用窗口函数检查特定范围值是否填充在 SQL 中? 【发布时间】:2020-01-08 12:05:59 【问题描述】:我正在做一个我们应该评估供应商的项目,在这个数据库中我有这张表EvaluationGrade
:
+------+---------------------+------------+-----------+
| Id | EvaluationMethodId | FromScore | ToScore |
+------+---------------------+------------+-----------+
| 1 | 2 | 1 | 20 |
| 2 | 2 | 21 | 50 |
| 3 | 2 | 51 | 70 |
| 4 | 2 | 71 | 100 |
| 5 | 3 | 1 | 20 |
| 6 | 3 | 31 | 40 |
+------+---------------------+------------+-----------+
此表对分数进行分类,我确信EvaluationMethodId=2
范围值填充 1 到 100(就像上面的示例一样)。
我正在寻找这样的东西:
+---------------------+------------+
| EvaluationMethodId | Sum |
+---------------------+------------+
| 2 | 100 |
| 3 | 30 |
+---------------------+------------+
这是我尝试的方式:
WITH myUpdate
AS (SELECT emg.Id,emg.EvaluationMethodId,
SUM(emg.ToGrade - emg.FromGrade) + 1 AS SumScope
FROM generalsup.EvaluationMethodGrading emg
GROUP BY emg.Id,emg.EvaluationMethodId)
SELECT myUpdate.EvaluationMethodId, SUM(myUpdate.SumScope) AS SumScopeAll
FROM myUpdate
GROUP BY myUpdate.EvaluationMethodId;
但我使用的窗口函数对服务器的开销较小。
【问题讨论】:
请显示您的尝试查询 @Squirrel - 我提出了查询 同一个EvaluationMethodId是否有重叠的情况,比如FromScore =1, ToScore = 20 and FromScore =10, ToScore = 30? @forpas- 不,在插入之前检查重叠,所以没有重叠。 【参考方案1】:由于分数没有重叠的情况,您可以使用group by EvaluationMethodId
和sum()
:
select EvaluationMethodId, sum(ToScore - FromScore + 1) [Sum]
from EvaluationMethodGrading
group by EvaluationMethodId
请参阅demo。 结果:
> EvaluationMethodId | Sum
> -----------------: | --:
> 2 | 100
> 3 | 30
【讨论】:
@forpas- 手动更改数据库,有没有办法更改此脚本以覆盖重叠范围?以上是关于如何使用窗口函数检查特定范围值是不是填充在 SQL 中?的主要内容,如果未能解决你的问题,请参考以下文章