我目前需要进行查询,根据特定状态为用户表创建运行总计,并在状态更改后重置。我已经完成了通常的运行总计脚本,但我的问题在于我不确定一旦他们回到那个特定状态,如何让计数再次从 1 开始。
这是我现在拥有的桌子:
用户 | 状态 | 日期 | Status_desc |
---|---|---|---|
用户 1 | 工作 | 03-01-2023 | 1 |
用户 1 | 工作 | 02-01-2023 | 1 |
用户 1 | 缺席 | 01-01-2023 | 0 |
用户 1 | 工作 | 12-01-2022 | 1 |
用户 1 | 工作 | 11-01-2022 | 1 |
用户 1 | 工作 | 11-01-2022 | 1 |
用户 2 | 工作 | 03-01-2023 | 1 |
用户 2 | 缺席 | 02-01-2023 | 0 |
用户 2 | 缺席 | 01-01-2023 | 0 |
用户 2 | 工作 | 12-01-2022 | 1 |
用户 2 | 工作 | 11-01-2022 | 1 |
用户 2 | 工作 | 11-01-2022 | 1 |
这是我试图获得的总计结果:
用户 | 状态 | 日期 | Status_desc | Running_total |
---|---|---|---|---|
用户 1 | 工作 | 03-01-2023 | 1 | 2 |
用户 1 | 工作 | 02-01-2023 | 1 | 1 |
用户 1 | 缺席 | 01-01-2023 | 0 | 0 |
用户 1 | 工作 | 12-01-2022 | 1 | 3 |
用户 1 | 工作 | 11-01-2022 | 1 | 2 |
用户 1 | 工作 | 11-01-2022 | 1 | 1 |
用户 2 | 工作 | 03-01-2023 | 1 | 1 |
用户 2 | 缺席 | 02-01-2023 | 0 | 0 |
用户 2 | 缺席 | 01-01-2023 | 0 | 0 |
用户 2 | 工作 | 12-01-2022 | 1 | 3 |
用户 2 | 工作 | 11-01-2022 | 1 | 2 |
用户 2 | 工作 | 11-01-2022 | 1 | 1 |
我试过正常运行的total window function,没用,因为我的partition是status。有什么解决方法吗?
select *
, sum(t0.working_flag)
OVER (PARTITION BY (t0.status_desc)
ORDER BY t0.date asc)
from (select *
, case when status_desc = 'working' then '1'
else 0
end as working_flag
from table) t0
order by date desc
with data as (
select *.
count(case when Status = 'Absent' then 1 end) over (partition by User order by Date) as grp
from T
)
select *,
count(case when Status <> 'Absent' then 1 end) over (partition by User, grp order by Date) as RunningTotal
from data
order by User, Date desc;