如下图:

当COMP = 'C1'时,逐月累计QUAT,
即
select COMP, sum(QUAT) over(partition by COMP order by YMONTH) as "QUAT" from table
where COMP= 'C1'
问题:
sum() over(partition by )能否使用where,即where 不写在最后,而是放在sum over里面,怎么写 ?
比如 , sum() over(partition by ..where..)
如下图:

当COMP = 'C1'时,逐月累计QUAT,
即
select COMP, sum(QUAT) over(partition by COMP order by YMONTH) as "QUAT" from table
where COMP= 'C1'
问题:
sum() over(partition by )能否使用where,即where 不写在最后,而是放在sum over里面,怎么写 ?
比如 , sum() over(partition by ..where..)
参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。
在SQL中,WHERE子句不能直接放入OVER()窗口函数中。OVER()函数是用来定义窗口或分区,用于计算如SUM(), AVG()等聚合函数,但它本身不支持内部的条件过滤。要实现类似的需求,比如仅对满足特定条件的行进行累计求和,你需要采用一种技巧,通常这涉及使用CASE语句来控制哪些值被纳入求和计算中。
针对您的需求,想要对COMP = 'C1'的记录进行逐月累计QUAT,可以这样写SQL语句:
SELECT
COMP,
YMONTH,
QUAT,
SUM(CASE WHEN COMP = 'C1' THEN QUAT ELSE 0 END)
OVER (PARTITION BY COMP ORDER BY YMONTH ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS "QUAT_CUMULATIVE"
FROM
your_table
WHERE
COMP = 'C1';
这段代码中,CASE WHEN COMP = 'C1' THEN QUAT ELSE 0 END确保了只有当COMP等于'C1'时,QUAT值才被加入到累计求和中,对于其他情况则贡献为0,从而实现了在累加过程中的条件过滤效果。这里使用了ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW来确保累积是按YMONTH顺序进行的,从第一行开始累积到当前行。