我正在尝试编写一个查询,该查询将选择表中的所有数字,但是那些带有重复的数字我想在最后附加一些内容以将其显示为重复。但是我不确定该怎么做。
这是表格的一个例子
TableA
ID Number
1 1
2 2
3 2
4 3
5 4
SELECT语句输出将是这样。
Number
1
2
2-dup
3
4
对此有任何见识将不胜感激。
答案 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