如何使用分组零件号填充 SQL 中的余额字段
How can I populate a balance field in SQL with grouped Part Numbers
我在 table 中有超过 800,000 行。这是我所拥有的一个例子。我想要做的是 运行 填充余额列的更新查询。
Part No
Current QOH
Supply
Demand
Balance
Previous Part No
ID
ABC123
15
0
1
1
ABC123
15
5
3
ABC123
2
ABC123
15
0
5
ABC123
3
DEF321
22
0
16
ABC123
4
DEF321
22
0
3
DEF321
5
DEF321
22
30
5
DEF321
6
DEF321
22
0
1
DEF321
7
DEF321
22
14
4
DEF321
8
DEF321
22
0
9
DEF321
9
DEF321
22
0
4
DEF321
10
Part Nos很多,都是分组的,如图
对于组中的第一个零件号,我想从当前 QOH 开始,减去需求并添加供应。然后对于组中所有剩余的部件号,我不从当前 QOH 开始,而是从前一行余额开始。然后从那里我减去需求并添加供应。一旦我们到达下一组零件号,我再次从当前 QOH 开始。我有使用 Lag 填充的上一个部件号。这有助于确定零件号是否是组中的第一个。
填充余额后,它应该如下所示:
Part No
Current QOH
Supply
Demand
Balance
Previous Part No
ID
ABC123
15
0
1
14
1
ABC123
15
5
3
16
ABC123
2
ABC123
15
0
5
11
ABC123
3
DEF321
22
0
16
6
ABC123
4
DEF321
22
0
3
3
DEF321
5
DEF321
22
30
5
28
DEF321
6
DEF321
22
0
1
27
DEF321
7
DEF321
22
14
4
37
DEF321
8
DEF321
22
0
9
28
DEF321
9
DEF321
22
0
4
24
DEF321
10
目前,我将数据加载到 Excel,手动填充第一个 Balance 字段,然后应用一个公式,我将其复制下来。然后我将数据加载回 SQL.
我还尝试了一个 VB 脚本,该脚本查看每一行,一次一个,并进行计算并填充余额。但是对于 800K 条记录,该脚本需要几个小时才能 运行.
我正在寻找 SQL 解决方案。
谢谢!
您可以使用 window functions
计算您的 运行 余额,如下所示:
select partNo, CurrentQOH, supply, Demand,
First_Value(CurrentQOH) over(partition by partno order by id)
+ Sum(supply-demand) over(partition by partno order by id) Balance,
PreviousPartNo, Id
from t
我在 table 中有超过 800,000 行。这是我所拥有的一个例子。我想要做的是 运行 填充余额列的更新查询。
Part No | Current QOH | Supply | Demand | Balance | Previous Part No | ID |
---|---|---|---|---|---|---|
ABC123 | 15 | 0 | 1 | 1 | ||
ABC123 | 15 | 5 | 3 | ABC123 | 2 | |
ABC123 | 15 | 0 | 5 | ABC123 | 3 | |
DEF321 | 22 | 0 | 16 | ABC123 | 4 | |
DEF321 | 22 | 0 | 3 | DEF321 | 5 | |
DEF321 | 22 | 30 | 5 | DEF321 | 6 | |
DEF321 | 22 | 0 | 1 | DEF321 | 7 | |
DEF321 | 22 | 14 | 4 | DEF321 | 8 | |
DEF321 | 22 | 0 | 9 | DEF321 | 9 | |
DEF321 | 22 | 0 | 4 | DEF321 | 10 |
Part Nos很多,都是分组的,如图
对于组中的第一个零件号,我想从当前 QOH 开始,减去需求并添加供应。然后对于组中所有剩余的部件号,我不从当前 QOH 开始,而是从前一行余额开始。然后从那里我减去需求并添加供应。一旦我们到达下一组零件号,我再次从当前 QOH 开始。我有使用 Lag 填充的上一个部件号。这有助于确定零件号是否是组中的第一个。
填充余额后,它应该如下所示:
Part No | Current QOH | Supply | Demand | Balance | Previous Part No | ID |
---|---|---|---|---|---|---|
ABC123 | 15 | 0 | 1 | 14 | 1 | |
ABC123 | 15 | 5 | 3 | 16 | ABC123 | 2 |
ABC123 | 15 | 0 | 5 | 11 | ABC123 | 3 |
DEF321 | 22 | 0 | 16 | 6 | ABC123 | 4 |
DEF321 | 22 | 0 | 3 | 3 | DEF321 | 5 |
DEF321 | 22 | 30 | 5 | 28 | DEF321 | 6 |
DEF321 | 22 | 0 | 1 | 27 | DEF321 | 7 |
DEF321 | 22 | 14 | 4 | 37 | DEF321 | 8 |
DEF321 | 22 | 0 | 9 | 28 | DEF321 | 9 |
DEF321 | 22 | 0 | 4 | 24 | DEF321 | 10 |
目前,我将数据加载到 Excel,手动填充第一个 Balance 字段,然后应用一个公式,我将其复制下来。然后我将数据加载回 SQL.
我还尝试了一个 VB 脚本,该脚本查看每一行,一次一个,并进行计算并填充余额。但是对于 800K 条记录,该脚本需要几个小时才能 运行.
我正在寻找 SQL 解决方案。
谢谢!
您可以使用 window functions
计算您的 运行 余额,如下所示:
select partNo, CurrentQOH, supply, Demand,
First_Value(CurrentQOH) over(partition by partno order by id)
+ Sum(supply-demand) over(partition by partno order by id) Balance,
PreviousPartNo, Id
from t