I have a table that with the following query gives me all the double values.
SELECT workorder, job.count
FROM (
SELECT workorder,
COUNT(*) OVER (PARTITION BY workorder) AS count
FROM engineering_job_schedule) AS job
WHERE job.count > 1 and workorder is not null
This will return something like
| workorder | cnt |
|---|---|
| M-22.20.171.3017 000001 | 2 |
| M-22.20.171.3017 000001 | 2 |
| M-22.20.176.3023 000001 | 2 |
| M-22.20.176.3023 000001 | 2 |
Now how would you use this query to create an UPDATE query to update all workorder values to a new counting-up number.
So that my new value would be
| workorder |
|---|
| M-22.20.171.3017 000001 |
| M-22.20.171.3017 000002 |
| M-22.20.176.3023 000001 |
| M-22.20.176.3023 000002 |
CodePudding user response:
You can use ROW_NUMBER() instead of COUNT(*) to calculate a number for every row. The ORDER BY clause is required so you'll have to find a column in engineering_job_schedule to specify the order.
Assuming the part you need to maintain is the first 16 characters, and the work order will be zero-padded to 6 digits, the query could look like this:
SELECT CONCAT( LEFT(workorder,16),
' ',
REPLICATE('0', 6 - LEN(RN)),
RN)
FROM
(
SELECT workorder,
ROW_NUMBER() OVER (PARTITION BY workorder ORDER BY OrderDate) AS RN,
COUNT(*) OVER (PARTITION BY workorder) AS count
FROM engineering_job_schedule
) job
WHERE
job.count>1 and workorder is not null
Once you're satisfied with the output you can create an UPDATE query based on the results of the query:
UPDATE job
SET
workorder =CONCAT( LEFT(workorder,16),
' ',
REPLICATE('0', 6 - LEN(RN)),
RN)
FROM
(
SELECT workorder,
ROW_NUMBER() OVER (PARTITION BY workorder ORDER BY OrderDate) AS RN,
COUNT(*) OVER (PARTITION BY workorder) AS count
FROM engineering_job_schedule
) job
WHERE
job.count>1 and workorder is not null
