如何使用窗口函数检查特定范围值是不是填充在 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 EvaluationMethodIdsum()

select EvaluationMethodId, sum(ToScore - FromScore + 1) [Sum]
from EvaluationMethodGrading 
group by EvaluationMethodId

请参阅demo。 结果:

> EvaluationMethodId | Sum
> -----------------: | --:
>                  2 | 100
>                  3 |  30

【讨论】:

@forpas- 手动更改数据库,有没有办法更改此脚本以覆盖重叠范围?

以上是关于如何使用窗口函数检查特定范围值是不是填充在 SQL 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OLDEB sql 选择命令中检查字段值是不是为特定字符长度?

用 SQL 填充稀疏数据(Rockset)

如何检查sql的第一列或第二列中是不是存在一个特定值?

如何检查在mysql中存储多个值的变量中是不是存在特定值?

Java:检查当前日期是不是在特定日期范围内[重复]

如果数据库表格单元格的内容是一个列表,我如何检查该列表是不是包含 T-SQL 中的特定值?