运行 总计 date/ID 根据值的最新变化 SQL

Running total by date/ID based on latest change to value SQL

我有一个独特的案例,我想每天计算 运行 总数量。我一直在寻找很多,但找不到正确的答案。在代码方面,我没有什么可以分享的,因为它涉及到很多敏感数据

下面是虚拟数据的table:

如您所见,按日期有多个重复 ID。我希望能够按如下方式计算 运行 个日期的总数:

对于 2022/03/24,运行 总数应为 9+33 = 42,在 2022/03/26,运行 总数应为 9+31 = 40。本质上,任何给定日期的 运行 总计应该根据 ID 选择最后一个值(如果它发生变化)或存在的值。在本例中,对于该日期的 2022/03/26,对于 ID 2072,我们选择 31 而不是 33,因为这是可用的最新值。

预期输出:

可能跨越很多天,运行 总数需要一天比一天。

可能的相关问题:

PS: 就上下文而言,ID 只是物品清单的唯一标识符。每件商品的数量每天都在变化。在此示例中,ID 1 的 inventoyr 最后一次更改是在 2022 年 3 月 24 日,而 ID 2072 则更改了多次。 运行 2022/03/24 的总数将是当天的库存项目数量。在 26 日,ID 1 没有变化,但 ID 2072 发生了变化,库存池应反映 ID 2072 的当前库存大小 + ID 1 的当前大小的总数。26 日,ID 1 再次没有任何变化,但 ID 2072变了。因此,库存大小 = ID 2072 的当前大小 + ID 1 的当前大小,在本例中为 40。本质上,它只是每天变化的当前库存大小。

非常感谢任何帮助!谢谢。

如果这是您真正想要的,我又添加了几行。

我用了T-SQL.

declare @orig table(
id          int,
quantity    int,
rundate     date
)


insert into @orig
values (1,9,'20220324'),(2072,33,'20220324'),(2072,31,'20220326'),(2072,31,'20220327'),
(2,10,'20220301'),(2,20,'20220325'),(2,30,'20220327')


declare @dates table (
runningdate date
)

insert into @dates
select distinct rundate from @orig
order by rundate


declare @result table (
dates               date,
running_quality     int
)


DECLARE @mydate date
DECLARE @sum int

-- CURSOR definition
DECLARE my_cursor CURSOR FOR  
SELECT * FROM @dates

OPEN my_cursor

-- Perform the first fetch
FETCH NEXT FROM my_cursor into @mydate

-- Check @@FETCH_STATUS to see if there are any more rows to fetch
WHILE @@FETCH_STATUS = 0
BEGIN

;with cte as (
select * from @orig
where rundate <= @mydate
), cte2 as (
select id, max(rundate) as maxrundate
from cte
group by id
), cte3 as (
select a.*
from cte as a join cte2 as b
on a.id = b.id and a.rundate = b.maxrundate
)
select @sum = sum(quantity)
from cte3

insert into @result
select @mydate, @sum


-- This is executed as long as the previous fetch succeeds
FETCH NEXT FROM my_cursor into @mydate

END -- cursor

CLOSE my_cursor
DEALLOCATE my_cursor

select * from @result

结果:

日期running_quality 2022-03-01 10 2022-03-24 52 2022-03-25 62 2022-03-26 60 2022-03-27 70