如果只有一列具有值,请删除重复项

时间:2013-08-15 11:28:40

标签: sql sql-server tsql

如果您的Id列和Value列有重复的行,这太容易了。但是在采访中我被问到如何删除它,如果你只有Value列。例如:

table_a输入:

Value
A
A
B
A
C
D
D
E
F
F
E

table_a输出:

Value
A
B
C
D
E
F

问题:您的表只有一列Value,并且您必须delete所有行都有重复项(如结果上部)。

3 个答案:

答案 0 :(得分:7)

如果您被允许使用CTE:

with cte as (
    select
        row_number() over(partition by Value order by Value) as row_num,
        Value
    from Table1
)
delete from cte where row_num > 1

sql fiddle demo

正如t-clausen.dk在评论中建议的那样,你甚至不需要在CTE内部获得价值:

with cte as (
    select
        row_number() over(partition by Value order by Value) as row_num
    from Table1
)
delete from cte where row_num > 1;

答案 1 :(得分:5)

嗯,请注意使用CTE

  

公用表表达式(CTE)可以被认为是临时表   在单个执行范围内定义的结果集   SELECT,INSERT,UPDATE,DELETE或CREATE VIEW语句。 CTE是   类似于派生表,因为它不存储为对象和   仅持续查询的持续时间。与派生表不同,a   CTE可以是自引用的,可以多次引用   相同的查询。

ROW_NUMBER

  

返回结果分区中行的序号   设置,从1开始,每个分区的第一行。

这样的东西
;WITH Vals AS (
        SELECT [Value],
                ROW_NUMBER() OVER(PARTITION BY [Value] ORDER BY [Value]) RowID
        FROM    MyTable
    )
DELETE 
FROM    Vals
WHERE   RowID > 1

答案 2 :(得分:0)

select distinct value
from your_table

(因为问题已被用户更新,不再相关,请参阅Roman Pekar的回答)