选择重复项,同时将除第一个之外的其他每个人串联

时间:2018-08-10 20:39:04

标签: mysql

我正在尝试编写一个查询,该查询将选择表中的所有数字,但是那些带有重复的数字我想在最后附加一些内容以将其显示为重复。但是我不确定该怎么做。

这是表格的一个例子

TableA
ID      Number
1       1
2       2
3       2
4       3
5       4

SELECT语句输出将是这样。

Number
1
2
2-dup
3
4

对此有任何见识将不胜感激。

2 个答案:

答案 0 :(得分:0)

我列出了所有非伪造的ID(左连接选择),然后将它们与整个列表进行比较(以此类推):

select case when a.id <> b.min_id then cast(a.Number as varchar(6)) + '-dup' else cast(a.Number as varchar(6)) end as Number from table_a left join (select MIN(b.id) min_id, Number from table_a b group by b.number)b on b.number = a.number

我在MS SQL 2016中做到了,希望对您有用。

这将创建使用的表:

insert into table_a (ID, Number) select 1,1 union all select 2,2 union all select 3,2 union all select 4,3 union all select 5,4

答案 1 :(得分:0)

如果您的mysql版本不支持窗口功能。您可以尝试编写一个子查询来生成row_number,然后使用CASE WHEN来判断rn > 1,然后标记dup

create table T (ID int, Number int);


INSERT INTO T VALUES  (1,1);
INSERT INTO T VALUES  (2,2);
INSERT INTO T VALUES  (3,2);
INSERT INTO T VALUES  (4,3);
INSERT INTO T VALUES  (5,4);

查询1

select t1.id,
       (CASE WHEN rn > 1 then CONCAT(Number,'-dup') ELSE Number END) Number
from (
  SELECT *,(SELECT COUNT(*) 
            FROM T tt 
            where tt.Number = t1.Number and tt.id <= t1.id
           ) rn
  FROM T t1
)t1

Results

| id | Number |
|----|--------|
|  1 |      1 |
|  2 |      2 |
|  3 |  2-dup |
|  4 |      3 |
|  5 |      4 |

如果可以使用窗口功能,则可以将row_number窗口功能结合使用,以rownumber制成Number

select t1.id,
       (CASE WHEN rn > 1 then CONCAT(Number,'-dup') ELSE Number END) Number
from (
  SELECT *,row_number() over(partition by Number order by id) rn
  FROM T t1
)t1

sqlfiddle