Here is my MySQL table. I updated the question by adding an ‘id’ column to it (as instructed in the comments by others).
id data_id 1 2355 2 2031 3 1232 4 9867 5 2355 6 4562 7 1232 8 2355
I want to add a new column called row_num
to assign an incrementing number ONLY for duplicates, as shown below. Order of the results does not matter.
id data_id row_num 3 1232 1 7 1232 2 2 2031 null 1 2355 1 5 2355 2 8 2355 3 6 4562 null 4 9867 null
I followed this answer and came up with the code below. But following code adds a count of ‘1’ to non-duplicate values too, how can I modify below code to add a count only for duplicates?
select data_id,row_num from ( select data_id, @row:=if(@prev=data_id,@row,0) + 1 as row_num, @prev:=data_id from my_table )t
Advertisement
Answer
I am assuming that id
is the column that defines the order on the rows.
In MySQL 8 you can use row_number()
to get the number of each data_id
and a CASE
with EXISTS
to exclude the rows which have no duplicate.
SELECT t1.data_id, CASE WHEN EXISTS (SELECT * FROM my_table t2 WHERE t2.data_id = t1.data_id AND t2.id <> t1.id) THEN row_number() OVER (PARTITION BY t1.data_id ORDER BY t1.id) END row_num FROM my_table t1;
In older versions you can use a subquery counting the rows with the same data_id
but smaller id
. With an EXISTS
in a HAVING
clause you can exclude the rows that have no duplicate.
SELECT t1.data_id, (SELECT count(*) FROM my_table t2 WHERE t2.data_id = t1.data_id AND t2.id < t1.id HAVING EXISTS (SELECT * FROM my_table t2 WHERE t2.data_id = t1.data_id AND t2.id <> t1.id)) + 1 row_num FROM my_table t1;