我的目标是从表中删除不是分组CaseKey的MAX(recordDate)的所有记录.因此,如果我有3组3个casekeys的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
)
Run Code Online (Sandbox Code Playgroud)
我收到错误:第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
);
Run Code Online (Sandbox Code Playgroud)
换句话说,对于zt中的每个记录,运行一个查询以查看同一记录是否也有一个记录具有更高的recordDate.如果是,则WHERE EXISTS语句通过并删除记录,否则WHERE语句失败并且记录是其自己的MAX recordDate.
感谢WildPlasser,因为这种简单的方法让我感觉不知所措.
wil*_*ser 22
MAX有一个特殊属性:没有高于最大值的记录.因此,我们可以删除具有相同CaseKey但具有更高recordDate的记录的所有记录:
DELETE FROM ztable zt
WHERE EXISTS (
SELECT *
FROM ztable ex
WHERE ex.CaseKey = zt.CaseKey
AND ex.recordDate > zt.recordDate
);
Run Code Online (Sandbox Code Playgroud)
BTW:上述查询(以及MAX()版本)假定只有一条记录具有最大日期.可能会有联系.
在tie的情况下,您需要在where子句中添加一个额外的字段; 作为决胜局.假设TableId可以这样运行,查询将变为:
DELETE FROM ztable zt
WHERE EXISTS (
SELECT *
FROM ztable ex
WHERE ex.CaseKey = zt.CaseKey
AND ( ex.recordDate > zt.recordDate
OR (ex.recordDate = zt.recordDate AND ex.TableId > zt.TableId)
)
);
Run Code Online (Sandbox Code Playgroud)
只是表达
从我的表中删除不是分组CaseKey的MAX(recordDate)的所有记录
在sql中
DELETE FROM table t1
WHERE t1.recordDate <>
(SELECT MAX(recordDate)
FROM table t2
WHERE t2.CaseKey = t1.CaseKey)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14843 次 |
| 最近记录: |