首页 > 解决方案 > 在 SQL 中处理库存波动

问题描述

我目前有一个表格,每 30 分钟记录一次整个设施的库存数量。我需要能够根据上次记录值之间的差异来显示零件编号的波动。因此,例如对于“MAA-0001”部分,如果它在上午 11 点有 100 个,在上午 1130 点有 150 个,我需要它显示“+50”,然后如果它在 1200 点达到 130,我需要它显示该行“- 20"。我只想要基于它最后记录的记录时间而不是滚动累积量的波动。

为值设置表的代码:

create table #temptablei (partnum nvarchar(50), loc nvarchar(50), logtime 
smalldatetime, amt float)

insert into #temptablei (partnum,loc,logtime,amt)
    VALUES
    ('maa-0001','whs1','2018-11-29 11:00:00',288),
    ('maa-0001','whs1','2018-11-29 11:30:00',253),
    ('maa-0001','whs1','2018-11-29 12:00:00',294),
    ('maa-0001','whs1','2018-11-29 12:30:00',181),
    ('maa-0001','whs1','2018-11-29 13:00:00',200),
    ('maa-0001','whs1','2018-11-29 13:30:00',218)

select * from #temptablei

我已经尝试使用其他示例中的 LAG 和 LEAD 命令,但它似乎只是给出了滚动累积量。我需要一些只显示最新记录值以及它与零件编号最后记录值之间的差异的东西。任何帮助将不胜感激!

标签: sqlsql-servertsql

解决方案


我希望答案是:

select t.*,
       (amt - lag(amt) over (partition by partnum, loc order by logtime)) as diff
from #temptablei t;

是一个 db<>fiddle。

要显示最后两个值,您只需使用top (2)

select top (2) t.*,
       (amt - lag(amt) over (partition by partnum, loc order by logtime)) as diff
from #temptablei t
order by logtime desc;

推荐阅读