如何在 SQL 服务器查询中重置 sum() over ()?
How do I reset a sum() over () in a SQL Server query?
我有一个派生的 table 看起来像这个例子:
{select * 来自 tb_data}
我希望结果具有额外的求和列,问题是如果信息列值 = 'reset'
,我需要求和列来重置工作值
{select *,(我假设 sum(number) over (partition by id order by date desc) 是 tb_data}
的总和
输出应该是这样的:
实际派生的table涵盖了数千个id,这就是为什么它需要按id分区并按date desc排序并且每个都有不同数量的重置点。
什么 SQL 查询会得到我需要的输出?
您可以先进行条件 window 求和来定义组:每次发现重置时,都会启动一个新组。然后你可以简单地在组内做 window 和 numbers
的总和。
select
id,
date,
info,
number,
sum(number) over(partition by id, grp order by date) summation
from (
select
t.*,
sum(case when info = 'reset' then 1 else 0 end)
over(partition by id order by date) grp
from mytable t
) t
我有一个派生的 table 看起来像这个例子:
{select * 来自 tb_data}
我希望结果具有额外的求和列,问题是如果信息列值 = 'reset'
,我需要求和列来重置工作值{select *,(我假设 sum(number) over (partition by id order by date desc) 是 tb_data}
的总和输出应该是这样的:
实际派生的table涵盖了数千个id,这就是为什么它需要按id分区并按date desc排序并且每个都有不同数量的重置点。
什么 SQL 查询会得到我需要的输出?
您可以先进行条件 window 求和来定义组:每次发现重置时,都会启动一个新组。然后你可以简单地在组内做 window 和 numbers
的总和。
select
id,
date,
info,
number,
sum(number) over(partition by id, grp order by date) summation
from (
select
t.*,
sum(case when info = 'reset' then 1 else 0 end)
over(partition by id order by date) grp
from mytable t
) t