【问题标题】:Retrieving duplicate and original rows from a table using sql query使用 sql 查询从表中检索重复和原始行
【发布时间】:2015-09-10 18:23:25
【问题描述】:

假设我有一个包含以下字段的学生表 - 学生 ID、学生姓名、年龄、性别、分数、班级。假设由于某些错误,每个学生对应于多个条目。我的要求是识别表中的重复行,过滤条件是学生姓名和班级。但是在查询结果中,除了识别重复记录之外,我还需要找到原始的重复学生详细信息。有什么方法可以做到这一点。我经历了这个答案:SQL: How to find duplicates based on two fields?。但是这里它只指定了如何找到重复的行,而不是识别被重复的实际行的方法。请说明可能的解决方案。谢谢。

【问题讨论】:

  • 学校作业?你试过什么?向我们展示表定义、示例数据、预期结果和当前查询。

标签: sql duplicates partitioning


【解决方案1】:

首先:如果您列出的列都在同一个表中,那么您的数据库结构似乎可以使用一些规范化。

就您的问题而言:我假设您的StudentID 字段是数据库生成的主键,因此没有重复。 (如果不是这种情况,我认为您的问题不仅仅是重复)。

我还假设重复行的 StudentID 值高于原始行。

我认为以下应该可行(注意:我尚未创建表格来验证这一点,因此它可能不会立即完美。如果不是,它应该相当接近)

select dup.StudentID as DuplicateStudentID
       dup.StudentName, dup.Age, dup.Gender, dup.Marks, dup.Class,
       orig.StudentID as OriginalStudentId
  from StudentTable dup
 inner join (   
                -- Find first student record for each unique combination
                select Min(StudentId) as StudentID, StudentName, Age, Gender, Marks, Class
                  from StudentTable t
                 group by StudentName, Age, Gender, Marks, Class
            ) orig on dup.StudentName = orig.StudenName
                  and dup.Age = orig.Age
                  and dup.Gender = orig.Gender
                  and dup.Marks = orig.Marks
                  and dup.Class = orig.Class
                  and dup.StudentID > orig.StudentID -- Don't identify the original record as a duplicate

【讨论】:

  • 这不是我原来的表。这只是我使用的示例数据。我会尝试您建议的解决方案。
  • 很公平 - 您应该从我给您的内容中了解解决方案的总体思路。
  • 如果有问题的数据比较大,这个查询会不会提高性能?
  • 是的——我认为会的。
猜你喜欢
  • 1970-01-01
  • 2017-04-03
  • 2011-11-21
  • 2017-04-08
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
相关资源
最近更新 更多