Below update statement is running in a loop, how do i avoid this?
I have 86Million rows in the table
update dbo.pw_part set ptype_pctg=pw.pctg
from (
select id,ppe,ptype,isnull(SUM(gw) * 100.0 / nullif(SUM(SUM(gw)) OVER (partition by ssn, ppe), 0), 0) as pctg
from pw_part
where year(ppe) <= 2017
group by id,ppe,ptype,gw
) as pw
Table Data as below
ID date type gw payPercentage 359 2015-03-28 R 1563.79 NULL 359 2015-04-04 M 11.41 NULL 359 2015-04-04 R 1563.79 NULL 359 2015-04-11 M 11.41 NULL 359 2015-04-11 R 1563.79 NULL 359 2015-04-18 M 11.41 NULL 795 2018-01-12 C 2382.39 NULL 795 2018-01-12 M 3.72 NULL 795 2018-01-12 R 3269.23 NULL 795 2018-01-26 C 1437.74 NULL 795 2018-01-26 M 3.72 NULL 795 2018-01-26 R 3269.23 NULL
Desired table should be
ID date type gw payPercentage 359 2015-03-28 R 1563.79 100 359 2015-04-04 M 11.41 .72 359 2015-04-04 R 1563.79 99.27 359 2015-04-11 M 11.41 .72 359 2015-04-11 R 1563.79 99.27 359 2015-04-18 M 11.41 100 795 2018-01-12 C 2382.39 42.12 795 2018-01-12 M 3.72 .06 795 2018-01-12 R 3269.23 57.80 795 2018-01-26 C 1437.74 30.52 795 2018-01-26 M 3.72 .07 795 2018-01-26 R 3269.23 69.4
Thank you,
Yum
Advertisement
Answer
Assuming that your query runs, you seem to need a where clause. I would speculate:
update dbo.pw_part
set ptype_pctg = pw.pctg
from (select id, ppe ,ptype,
coalesce(SUM(gw) * 100.0 / nullif(SUM(SUM(gw)) OVER (partition by ssn, ppe), 0), 0) as pctg
from pw_part
where year(ppe) <= 2017
group by id, ppe, ptype
) pw
where pw_part.id = pw.id and pw_part.ppe = pw.ppe and
pw_part.ptype = pw.ptype ;
Note that I removed gw from the group by. It is used as the argument to an aggregation function, so I’m guessing is should not also be a gropu by key.