我的目标是从我的表中删除所有不是分组 CaseKey 的 MAX(recordDate) 的记录。因此,如果我有 3 组 3 个 casekey 的 9 条记录,并且每个 casekey 都有其 3 个日期。我会删除每组的 2 个较低日期并得出 3 个总记录,只有每个剩余的 MAX(recordDate)。
我有以下 SQL 查询:
DELETE FROM table
WHERE tableID NOT IN (
SELECT tableID
FROM (
Select MAX(recordDate) As myDate, tableID From table
Group By CaseKey
) As foo
)
我收到错误:第 3 行出错... 列 'table.tableID' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
显然,我可以将 tableID 添加到我的 Group By 子句,但是该语句的结果不正确并返回所有行,而不是仅返回分组 CaseKeys 的 MAX recordDate。
服务器现在已关闭,但明显的答案是:(WildPlasser 答案的微小调整)
DELETE zt FROM ztable zt
WHERE EXISTS (
SELECT * FROM ztable ex
WHERE ex.CaseKey = zt.CaseKey
AND ex.recordDate > zt.recordDate
);
换句话说,对于zt中的每条记录,运行一个查询,看看同一条记录是否也有记录日期更高的记录。如果是,则 WHERE EXISTS 语句通过并删除该记录,否则 WHERE 语句失败,该记录为其自己的 MAX recordDate。
谢谢你,WildPlasser,感谢我以某种方式搞砸的那种简单化的方法。