我正在尝试删除重复的行,但保留最近更新的行。
这是我的数据集的说明:
我正在尝试删除两行较旧的数据(在本例中为 11/19 - 以黄色突出显示)。
这是文本数据集:
员工 | ID | 打孔开始 | 打孔结束 | 打卡时间 | 日期加载 |
---|---|---|---|---|---|
约翰·多伊 | 276567 | 2023 年 9 月 30 日 下午 2:50 | 2023 年 10 月 1 日 6:00 | 15.16666667 | 11/19/23 下午 2:45 |
简·无名氏 | 140037 | 2023 年 9 月 30 日 10:00 | 2023 年 10 月 1 日 7:05 | 9.083333333 | 11/19/23 下午 2:45 |
约翰·多伊 | 276567 | 2023 年 9 月 30 日 下午 2:50 | 2023 年 10 月 1 日 6:00 | 15.16666667 | 11/20/23 下午 2:45 |
简·无名氏 | 140037 | 2023 年 9 月 30 日 10:00 | 2023 年 10 月 1 日 7:05 | 9.083333333 | 11/20/23 下午 2:45 |
我尝试使用这段代码(基于这篇文章):
with todelete as
(
select
,[employee]
,[ID]
,[punch_start]
,[punch_end]
,[punch_hours]
,row_number() over
(
partition by
[employee]
,[ID]
,[punch_start]
,[punch_end]
,[punch_hours]
order by [date_load] desc) as seqnum
from [dbo].[dataset]
)
select * from todelete where seqnum > 1;
delete from todelete where seqnum > 1;
但结果(在 Select * 上)是:
我们如何修改代码以区分/仅选择具有较旧的 [date_load] 的行?
也许SQL Server中的DELETE有足够的语法来支持这一点,但我通常在这里进行MERGE。
https://dbfiddle.uk/_5PR_82q
另外,也许 SQL Server 做了一些我不知道的魔法。但在你原来的问题中
可能只是语法失败。因为 todelete 只是在完全独立的查询中定义的 cte。