删除 SQL 中的重复行

Removing Duplicate Rows in SQL

我有一个查询 returns 具有多个 "moved" 日期的设备列表。我只想要最早的日期条目。我使用 MIN 函数给我最早的日期,但我仍然得到多个条目(但是,我得到的比以前少)。我试图获得更精确的 JOIN,但我无法再缩小字段范围。

如果你看一下截图,前三行有相同的 "wonum" 但有三行不同 "Moved Dates." 我在想如果我能以某种方式把最旧的 "Moved Date"从这三行中删除其他行,这将给我我正在寻找的结果。但是,我的技能不足以做到这一点(我现在只在 SQL 工作了几个月)。那行得通吗,还是有更好的方法来缩小我的结果?我想知道我是否需要执行某种子查询来获得我需要的东西。

我环顾四周,但找不到任何东西可以让我按照我想要的方式删除一行数据。我似乎也找不到我的 MIN 函数不再削减数据的原因。下面是我目前正在使用的代码。感谢您提供的任何帮助。

SELECT wo.wonum, wo.location, wo.statusdate, wo.status, l.subcontractor,
    wo.description, MIN(ast.datemoved) AS 'Moved Date'
FROM workorder wo
        JOIN locations l ON wo.location = l.location
        JOIN asset a ON wo.location = a.location 
          -- AND wo.assetnum = a.assetnum
        JOIN assettrans ast ON a.assetnum = ast.assetnum
          -- AND a.assetid = ast.assetid
WHERE wo.description LIKE '%deteriorating%'
        AND wo.status != 'close'
GROUP BY wo.wonum, wo.location, wo.statusdate, 
  wo.status, l.subcontractor, wo.description
ORDER BY wo.wonum;

DBV SQL Query Result

更新:Table Data

您需要在子查询内的连接语句中进行分组(未测试,但您会明白):

替换

JOIN assettrans ast ON a.assetnum = ast.assetnum

inner join
(
    select ast.assetnum,MIN(ast.datemoved) AS 'Moved Date' 
    from assettrans ast  
    group by ast.assetnum
) grouped
on a.assetnum = grouped.assetnum

所以完整的查询如下所示:

SELECT wo.wonum, wo.location, wo.statusdate, wo.status, l.subcontractor,
    wo.description, grouped.MovedDate
FROM workorder wo
        JOIN locations l ON wo.location = l.location
        JOIN asset a ON wo.location = a.location 
        INNER JOIN
        (
           select ast.assetnum,MIN(ast.datemoved) AS MovedDate 
           from assettrans ast  
           group by ast.assetnum
        ) grouped
        on a.assetnum = grouped.assetnum
    WHERE wo.description LIKE '%deteriorating%'
            AND wo.status != 'close'
    ORDER BY wo.wonum;

请在生产前测试

--如果你有id列并且留下最早的记录

从 MyTable T1、MyTable T2 中删除 T1 其中 T1.dupField = T2.dupField(如果适用,添加更多过滤器) 和 T1.uniqueField > T2.uniqueField

--如果要删除新的"Moved Dates"而保留最老的

从 MyTable T1、MyTable T2 中删除 T1 其中 T1.dupField = T2.dupField(如果适用,添加更多过滤器) 和 T1.Moved 日期 > T2.Moved 日期