【问题标题】:How to remove duplicate data from microsoft sql database(on the result only)如何从 microsoft sql 数据库中删除重复数据(仅在结果上)
【发布时间】:2021-07-23 06:04:26
【问题描述】:

列代码具有重复的值,我确实想删除该行的重复项。

例如,我想删除列代码的重复项以及其上具有重复项的行。另一列是否重复并不重要,但我确实想将它基于代码列。我可以使用什么 sql 查询。?谢谢

this is the table I am working to.

如您所见,有一个值为 1 的 isdeleted 列。我只想要它们的值为 0 的记录

这是一个示例记录,在这里您可以看到第 1 行的 isdeleted 值为 1,这意味着该记录已被删除,我只需要此代码的第 2 行。

【问题讨论】:

  • “Microsoft SQL” - 您是指 SQL Server(如果是 - 请添加 sql-server 标记!),或者您指的是 Microsoft 中使用的 SQL使用权? (ms-access)
  • 您决定保留几行中的哪一行以及删除哪一行的逻辑是什么?
  • 您需要在 where 子句中添加额外的谓词,以使您要删除的每一行都是唯一的。根据数据的结构方式,您可能会在删除语句的子查询中使用 RANK 函数,因此可以删除排名大于 1 的每一行。有很多方法可以解决这个问题,这一切都取决于表中的数据。
  • 它用于 SQL 服务器,我的错。我确实想要一个输出,该输出将删除列代码上的重复项,并仅保留按当前年份从有效日期列中排序的行。这是样品表。希望你们能帮助我,因为这张桌子上有数千个重复项。我只希望删除重复项,并仅使用 table 中的有效日期保留唯一行。我不是要删除数据,只是一个显示排序输出的查询。

标签: sql sql-server duplicates


【解决方案1】:

您可以使用窗口函数ROW_NUMBER() 来挑出每个code 的最后一个条目,例如:

SELECT code, shortdesc, longdesc, isobsolete, effectivefromdate 
FROM (
 SELECT ROW_NUMBER() OVER(PARTITION BY code ORDER BY effectivefromdate DESC) AS rn, * 
 FROM CodingSuite_STG 
 WHERE isobsolete=1 AND isdeleted=0 
) AS cs
WHERE rn=1 
ORDER BY effectivefromdate

说明:

操作的核心是“子查询”。这是一个“类似表格”的表达式,它由一个用括号括起来的SELECT 子句生成,然后是一个表名,例如:

( SELECT * FROM CodingSuite_STG WHERE iobsolete=1 ) AS cs

对于外部SELECT,它将显示为一个名为“cs”的表格。

在这个子查询中,我放置了一个由两部分组成的特殊函数(“窗口函数”):

ROWN_NUMBER() OVER ( PARTITION BY code ORDER BY effectivefromdate DESC) AS rn

ROW_NUMBER() 函数返回由紧随其后的OVER ( ... ) 子句定义的某个记录“窗口”的序号。其中的PARTITION BY 定义了组划分方案(类似于GROUP BY),因此每个分区组的行号从1 开始。 ORDER BY 确定每个组内的编号顺序。因此,对于具有相同code 值的条目,ROW_NUMBER() 将为每条记录提供编号序列1, 2, 3...,其中1 被分配给具有最高值effectivefromdate 的记录,因为ORDER BY effectivefromdate DESC

在外部SELECT 子句中我们需要做的就是从子查询cs 中获取rn 值为1 的记录,我们就完成了!

【讨论】:

  • 刚刚在order by 子句中添加了“DESC”——正如我所说:“未经测试”... ;-)
  • 刚刚添加了iobsolote=1条件。现在更加专注了。
  • 嗯,这应该很容易适应。我刚刚在子查询的 Where 子句中添加了 AND isdeleted=0,它应该可以完成这项工作。
  • 好吧,如果你仍然想查看那些记录,但你想应用排序顺序,那么你应该使用ORDER BY effectivefromdate, isdeleted按它排序并删除@987654349 @ 再次来自 WHERE 子句。
  • 嗨@johndenverabella,我很高兴能为您提供帮助!如果你真的想感谢我,你可以简单地“接受”我的回答。接受答案会将问题标记为“已回答”,并向其他 SO 访问者发出信号,表明它不需要进一步关注。 ;-)
猜你喜欢
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2017-07-02
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多