I needed to fix a select, because I have the same id_question for different questions.
In the example below, id 297914 has 2 id_question with value '3' but the correct one would be '3' and '3A'
wrong way
| id | id_question | answer |
|---|---|---|
| 297914 | 3 | aaa |
| 297914 | 3 | bbb |
| 297933 | 3 | ccc |
| 297933 | 3 | ddd |
correct way
| id | id_question | answer |
|---|---|---|
| 297914 | 3 | aaa |
| 297914 | 3B | bbb |
| 297933 | 3 | ccc |
| 297933 | 3B | ddd |
Is there any way to fix this?
CREATE TABLE #form
(
[id] int,
[id_question] varchar(2),
[answer] varchar(10)
);
INSERT INTO #form
(
[id], [id_question], [answer]
)
VALUES
(297914, '3', 'aaa'),
(297914, '3', 'bbb'),
(297933, '3', 'ccc'),
(297933, '3', 'ddd')
SELECT * FROM #form
CodePudding user response:
Would a simple flag to identify the first match work?
select
id, id_question,
case when row_number() over(partition by id,id_question order by answer) = 1 then 1 else 0 END AS is_valid,
answer
FROM
#form
CodePudding user response:
Try using a CTE with ROW_NUMBER to find the duplicate values, then UPDATE the table appending ASCII characters starting with @ 1, in which A follows @ (See ASCII table).
WITH CTE AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY id
ORDER BY id_question DESC, answer DESC) AS RN
FROM #form)
UPDATE CTE SET id_question= id_question CHAR(ASCII('@') 1)
WHERE RN > 1;
See Fiddle
Result:
| id | id_question | answer |
|---|---|---|
| 297914 | 3A | aaa |
| 297914 | 3 | bbb |
| 297933 | 3A | ccc |
| 297933 | 3 | ddd |
