没有光标的 TSQL 帮助
TSQL Help Without Cursor
我有以下数据,我需要的输出在列中:新库存。当前使用 Cursor 来导出值,但存在性能问题,因为 no.of 记录在源 table.
中增加
ID
Item
Inventory
Projected Shipment
Receipt
LinkDate
NewInventory
1
Item1
'10'
'2'
'5'
'01-Sep-2021'
'13'
1
Item2
'20'
'3'
'8'
'02-Sep-2021'
'18'
1
Item3
'30'
'8'
'15'
'03-Sep-2021'
'25'
2
Item4
'40'
'10'
'20'
'01-Sep-2021'
'50'
2
Item5
'50'
'25'
'20'
'02-Sep-2021'
'45'
2
Item6
'60'
'10'
'20'
'03-Sep-2021'
'55'
值的计算方式如下:对于每个基于 ID Order by LinkDate 的分区,第一行将基于此公式:
NewInventory = Inventory+Receipt-ProjectedShipment
所以第一条记录变成:10+5-3 =13。该值成为基本库存,并将在后续行中用于计算同一分区中的新库存。
实例'Item2' ID=1
New Inventory = Previous calculated NewInventory + Current Row Receipt- Current Row Projected Shipment
这就变成了
新库存=13+8-3--变成18
目前所有这些逻辑都是在 Cursor 的帮助下实现的。请让我知道是否有仅使用 tsql 的直接方法来解决当前的性能问题。
请帮忙。
提前致谢
您可以使用 FIRST_VALUE()
和 SUM()
window 函数来实现:
SELECT *,
FIRST_VALUE(Inventory) OVER (PARTITION BY ID ORDER BY LinkDate) +
SUM(Receipt - ProjectedShipment) OVER (PARTITION BY ID ORDER BY LinkDate) NewInventory
FROM tablename;
参见demo。
它仅适用于 SUM() OVER
SELECT *,
SUM(Inventory + Receipt - ProjectedShipment) OVER (PARTITION BY ID ORDER BY LinkDate) NewInventory
FROM tablename;
我有以下数据,我需要的输出在列中:新库存。当前使用 Cursor 来导出值,但存在性能问题,因为 no.of 记录在源 table.
中增加ID | Item | Inventory | Projected Shipment | Receipt | LinkDate | NewInventory |
---|---|---|---|---|---|---|
1 | Item1 | '10' | '2' | '5' | '01-Sep-2021' | '13' |
1 | Item2 | '20' | '3' | '8' | '02-Sep-2021' | '18' |
1 | Item3 | '30' | '8' | '15' | '03-Sep-2021' | '25' |
2 | Item4 | '40' | '10' | '20' | '01-Sep-2021' | '50' |
2 | Item5 | '50' | '25' | '20' | '02-Sep-2021' | '45' |
2 | Item6 | '60' | '10' | '20' | '03-Sep-2021' | '55' |
值的计算方式如下:对于每个基于 ID Order by LinkDate 的分区,第一行将基于此公式:
NewInventory = Inventory+Receipt-ProjectedShipment
所以第一条记录变成:10+5-3 =13。该值成为基本库存,并将在后续行中用于计算同一分区中的新库存。
实例'Item2' ID=1
New Inventory = Previous calculated NewInventory + Current Row Receipt- Current Row Projected Shipment
这就变成了
新库存=13+8-3--变成18
目前所有这些逻辑都是在 Cursor 的帮助下实现的。请让我知道是否有仅使用 tsql 的直接方法来解决当前的性能问题。
请帮忙。
提前致谢
您可以使用 FIRST_VALUE()
和 SUM()
window 函数来实现:
SELECT *,
FIRST_VALUE(Inventory) OVER (PARTITION BY ID ORDER BY LinkDate) +
SUM(Receipt - ProjectedShipment) OVER (PARTITION BY ID ORDER BY LinkDate) NewInventory
FROM tablename;
参见demo。
它仅适用于 SUM() OVER
SELECT *,
SUM(Inventory + Receipt - ProjectedShipment) OVER (PARTITION BY ID ORDER BY LinkDate) NewInventory
FROM tablename;