在 SQL 服务器中筛选 window 函数

Filtering on window functions in SQL Server

我从 5 个 select 语句生成了一个名为 mycte 的 CTE,使用 union 将它们组合起来。特定作业的输出如下所示:

ID JOB_ID STATUS BASE_ID PERCENTAGE
20DA GBR01 0 12 20
21DA GBR01 0 12 30
21DA GBR01 0 14 50

对于每个唯一 JOB_ID,百分比总和必须为 100%。

为了测试我的 CTE,我使用了:

SELECT JOB_ID, SUM(PERCENTAGE) AS myTOTAL
FROM myCTE
GROUP BY JOB_ID
HAVING SUM(PERCENTAGE) <> 100
ORDER BY SUM(PERCENTAGE)

输出结果显示,由于数据库中有脏数据,总和并非全部为 100。然后我尝试提取 2 个不同的 tables,一个用于 PERCENTAGE = 100%,另一个用于 <> 100%。

由于我需要为新 table 提取的列是 ID、JOB_ID、STATUS、BASE_ID 和 PERCENTAGE,因此我应用了

SELECT
    ID, JOB_ID, STATUS, BASE_ID, PERCENTAGE,
    SUM(percentage) OVER (PARTITION BY JOB_ID, BASE_ID, ID) AS PERCENTAGE_SUM
FROM
    mycte

不幸的是,where 子句不适用于 window 函数。

问题:如何从 mycte 中提取百分比总和 = 100 的 ID, JOB_ID, STATUS, BASE_ID, PERCENTAGE

查看示例数据,您似乎只需要按 JOB_ID 进行分区:

WITH mycte AS (
    ...
), cte2 as (
    SELECT
        ID, JOB_ID, STATUS, BASE_ID, PERCENTAGE,
        SUM(percentage) OVER (PARTITION BY JOB_ID) AS PERCENTAGE_SUM 
    FROM mycte
)
SELECT *
FROM cte2
WHERE PERCENTAGE_SUM = 100