我有一个查询,它返回一个包含多个"移动的设备的列表"日期。我只想要最早的日期条目。我使用MIN函数给我最早的日期,但我仍然得到多个条目(但是,我比以前更少)。我试图获得更精确的JOIN,但我不能再缩小字段了。
如果您查看屏幕截图,前三行具有相同的" wonum"但有三个不同的移动日期。"我想如果我能以某种方式采取最早的"移动日期"在这三个中删除其他行,这将给我我想要的结果。但是,我没那么熟练(我现在只在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;
更新:Table Data
答案 0 :(得分:0)
你需要在子查询中的join语句中进行分组(未经过测试,但你会得到这个想法):
替换
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;
答案 1 :(得分:0)
请在生产中使用前进行测试
- 如果您有id列并保留最早的记录
从MyTable T1,MyTable T2中删除T1 其中T1.dupField = T2.dupField(如果适用则添加更多过滤器) 和 T1.uniqueField> T2.uniqueField
- 如果您要删除新的“移动日期”并保留最旧的日期
从MyTable T1,MyTable T2中删除T1 其中T1.dupField = T2.dupField(如果适用则添加更多过滤器) 和 T1.Moved Dates> T2.Moved Dates