在 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
我从 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