SQL-如何删除重复值

时间:2018-07-26 13:36:14

标签: sql sql-server

我的要求是删除重复值。

id  name    surname value
1   Vinduja Vijayan 5
3   Vinduja Vijayan 6
4   Vinduja Vijayan 7

必填输出:

id  name    surname value
1   Vinduja Vijayan 5
3   NuLL    Null    6
4   NULL    NULL    7

5 个答案:

答案 0 :(得分:3)

通常应在应用程序层中应用此转换。可以通过使用row_number()case在SQL中进行操作,但不建议这样做:

select id,
       (case when row_number() over (partition by name, surname order by id) = 1
             then name
        end) as name,
       (case when row_number() over (partition by name, surname order by id) = 1
             then surname
        end) as surname
from t
order by id;

请注意,最后一个order by非常非常重要。默认情况下,SQL结果集(如表)为无序。没有显式的order by,结果可能会以任何顺序出现,这会弄乱您对结果的解释。

答案 1 :(得分:2)

enter image description here

DECLARE @table TABLE (
        Id INT
        ,Name VARCHAR(20)
        ,Surname VARCHAR(20)
        ,value INT
        );


INSERT into @table(ID,Name,Surname,value)
Select 1,'Vinduja','Vijayan',5
Union
Select 3,'Vinduja','Vijayan',6
Union
Select 4,'Vinduja','Vijayan',7

Select S.Id ,T.Name,T.Surname,S.value from (
Select * ,ROW_NUMBER() Over(Partition by name Order by name) [Row]
From @table)S 
Left join @table T On T.Id =S.Id and S.[Row]=1

答案 2 :(得分:1)

select
id,
case when rnk=1 then name end as name,
case when rnk=1 then surname end as surname ,
value
from
(
select
id,name,surname,value,
row_number()over(partition by name,surname order by id) as rnk
from table_name)repeatname

答案 3 :(得分:0)

我不确定我是否理解您的要求。如果您只想按说明显示数据,则此方法将无效。但是,如果您要更改表中的数据,则可以这样做。

DECLARE @Dupes TABLE
(
  id INT
  ,name VARCHAR(30)
  ,surname VARCHAR(30)
  ,value INT
);

INSERT @Dupes
  (
    id
   ,name
   ,surname
   ,value
  )
VALUES
  (1, 'Vinduja', 'Vijayan', 5),
  (3, 'Vinduja', 'Vijayan', 6),
  (4, 'Vinduja', 'Vijayan', 7);

WITH cte AS 
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY [name], surname ORDER BY id) AS RowNum
    ,id
    ,name
    ,surname
    ,value
  FROM @Dupes
)
UPDATE cte
  SET cte.name = NULL
      ,cte.surname = NULL
  WHERE 
    cte.RowNum > 1;

SELECT *
FROM @Dupes;

--Results
+----+---------+---------+-------+
| id |  name   | surname | value |
+----+---------+---------+-------+
|  1 | Vinduja | Vijayan |     5 |
|  3 | NULL    | NULL    |     6 |
|  4 | NULL    | NULL    |     7 |
+----+---------+---------+-------+

答案 4 :(得分:0)

仅出于兴趣,可以使用LAG函数。我假设使用SQL Server。

select id, 
       iif(name = previous_name, null, name) name, 
       iif(surname = previous_surname, null, surname) surname
  from (
    select name, surname, id, 
           lag(name, 1, null) over (order by name, surname, id) previous_name, 
           lag(surname, 1, null) over (order by name, surname, id) previous_surname
      from table_name ) a
 order by a.name, a.surname, a.id