这太容易了,如果你有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
所有重复的行(如结果上部)。
这太容易了,如果你有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
所有重复的行(如结果上部)。
如果您被允许使用 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) 视为在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集。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 value
from your_table
(不再相关,因为问题已由用户更新,请参阅 Roman Pekar 的回答)