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

Sql 如果只有一列具有值,请删除重复项,sql,sql-server,tsql,Sql,Sql Server,Tsql,如果您的Id列和Value列有重复的行,那么这太容易了。但是在采访中,我被问到如果你只有Value列,如何删除它。例如: 表a输入: Value A A B A C D D E F F E 表a输出: Value A B C D E F 问题:您的表只有一列值,您必须删除所有重复的行(如上面的结果) (由于问题已由用户更新,因此不再相关,请参见Roman Pekar的答案) (由于问题已由用户更新,因此不再相关,请参阅Roman Pekar的答案)如果允许您使用CTE: with cte a

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

表a输入:

Value
A
A
B
A
C
D
D
E
F
F
E
表a输出:

Value
A
B
C
D
E
F
问题:您的表只有一列
,您必须
删除
所有重复的行(如上面的结果)

(由于问题已由用户更新,因此不再相关,请参见Roman Pekar的答案)


(由于问题已由用户更新,因此不再相关,请参阅Roman Pekar的答案)

如果允许您使用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

正如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;

如果允许您使用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

正如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;
好吧,那就用一个

公共表表达式(CTE)可以看作是临时的 在单个对象的执行范围内定义的结果集 选择、插入、更新、删除或创建视图语句。CTE是 与派生表类似,它不存储为对象,并且 仅在查询期间持续。与派生表不同 CTE可以自引用,并且可以在中多次引用 同样的问题

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

差不多

;WITH Vals AS (
        SELECT [Value],
                ROW_NUMBER() OVER(PARTITION BY [Value] ORDER BY [Value]) RowID
        FROM    MyTable
    )
DELETE 
FROM    Vals
WHERE   RowID > 1
好吧,那就用一个

公共表表达式(CTE)可以看作是临时的 在单个对象的执行范围内定义的结果集 选择、插入、更新、删除或创建视图语句。CTE是 与派生表类似,它不存储为对象,并且 仅在查询期间持续。与派生表不同 CTE可以自引用,并且可以在中多次引用 同样的问题

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

差不多

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

在SELECT查询中简单使用DISTINCT……在SELECT查询中简单使用DISTINCT……向下投票这有点苛刻,考虑到它实际上实现了问题要求的+1补偿,我们需要从表中删除行,而不是选择向下投票这有点苛刻,考虑到它实际上实现了问题要求的+1补偿,我们需要从表中删除行,而不是选择