删除 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 日期
我有一个查询 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 日期