Sql 删除具有最旧GUID的重复记录

Sql 删除具有最旧GUID的重复记录,sql,sql-server,Sql,Sql Server,如何在没有时间戳和GUID作为Primary Key的情况下从最早的记录和最新记录中删除重复记录 例如,如果我有4条记录,则根据GUID删除最早的3条记录 就我所知 WITH cte AS(SELECT ID, ROW_NUMBER() OVER(PARTITION BY CodeOne, CodeTwo ORDER BY(SELECT 0)) RN FROM [InvoiceDatabase].[dbo].[LookUpCode]) DELETE

如何在没有时间戳和
GUID
作为
Primary Key
的情况下从最早的记录和最新记录中删除重复记录

  • 例如,如果我有4条记录,则根据GUID删除最早的3条记录
就我所知

WITH cte 
     AS(SELECT ID, ROW_NUMBER() OVER(PARTITION BY CodeOne, CodeTwo
     ORDER BY(SELECT 0)) RN
     FROM [InvoiceDatabase].[dbo].[LookUpCode])
     DELETE FROM cte
     WHERE  RN > 1;

但这并不是我所需要的,尽管正确地删除了重复项。有没有办法做到这一点,或者不可能使用
GUID
来判断哪个记录较旧?

如果要删除重复的记录,但没有时间戳和GUID作为主键,可以尝试使用
%%physloc%%

%%physloc%%
是一个虚拟列。此列未记录在案。因此,您可以自行承担使用风险

WITH cte 
     AS(SELECT ID, ROW_NUMBER() OVER(PARTITION BY CodeOne, CodeTwo
     ORDER BY  %%physloc%%) RN
 FROM [InvoiceDatabase].[dbo].[LookUpCode])
 DELETE FROM cte
WHERE  RN > 1;

注意


但是我建议您为订单创建一个时间戳。

如果您想删除重复记录,但没有时间戳和GUID作为主键,您可以尝试使用
%%physloc%%

%%physloc%%
是一个虚拟列。此列未记录在案。因此,您可以自行承担使用风险

WITH cte 
     AS(SELECT ID, ROW_NUMBER() OVER(PARTITION BY CodeOne, CodeTwo
     ORDER BY  %%physloc%%) RN
 FROM [InvoiceDatabase].[dbo].[LookUpCode])
 DELETE FROM cte
WHERE  RN > 1;

注意



但我建议您为订单创建一个时间戳。

添加一个时间戳列,或一个增量ID列,或一些反映订单的内容。。。。否则它将是随机的。@RahulNeekhra的可能重复,除了重复的部分,这是一个完全不同的问题。@scsimon,叹气,我很害怕。哦,好吧,值得一试。谢谢。大多数(如果不是所有的话)现代guid都是v4 guid,它使用所有随机值作为它们的位。这包括
NEWID()
。有一些GUID格式确实包含时间戳,但它们不再常用。顾名思义,T-SQL的
NEWSEQUENTIALID()
是连续的,但只在机器重新启动之前。总之,guid并不是订单的最佳依赖。添加一个timestamp列、一个increment ID列或一些反映订单的内容。。。。否则它将是随机的。@RahulNeekhra的可能重复,除了重复的部分,这是一个完全不同的问题。@scsimon,叹气,我很害怕。哦,好吧,值得一试。谢谢。大多数(如果不是所有的话)现代guid都是v4 guid,它使用所有随机值作为它们的位。这包括
NEWID()
。有一些GUID格式确实包含时间戳,但它们不再常用。顾名思义,T-SQL的
NEWSEQUENTIALID()
是连续的,但只在机器重新启动之前。归根结底,guid并不是订单的最佳选择。它的准确性如何?如果有可能失败,我最好创建一个时间戳列。我将向UV寻求帮助,并让它接受我在问题中提出的问题。非常感谢你的帮助。读过这篇文章后,我不会相信
%%physloc%%
。如果您的表有任何删除、页面拆分等,则
%%physloc%%
的值可能不再与插入行的时间顺序相对应。请不要这样做,这是非常不可靠的。行的物理顺序仅当您基本上不对表执行任何操作,只插入完全填充的页面时,才表示它们的插入顺序。任何其他修改和所有赌注都将取消。如果它适用于大多数行(少数行除外),那么它可能特别有害。祝你好运,我喜欢这个解决方案。我也读过这本书,它会派上用场的。这有多准确?如果有可能失败,我最好创建一个时间戳列。我将向UV寻求帮助,并让它接受我在问题中提出的问题。非常感谢你的帮助。读过这篇文章后,我不会相信
%%physloc%%
。如果您的表有任何删除、页面拆分等,则
%%physloc%%
的值可能不再与插入行的时间顺序相对应。请不要这样做,这是非常不可靠的。行的物理顺序仅当您基本上不对表执行任何操作,只插入完全填充的页面时,才表示它们的插入顺序。任何其他修改和所有赌注都将取消。如果它适用于大多数行(少数行除外),那么它可能特别有害。祝你好运,我喜欢这个解决方案。我也读过这本书,它会派上用场的。