SQL:删除GroupBy中的所有NOT MAX记录

我的目标是删除我的表中不是分组CaseKey的MAX(recordDate)的所有记录.所以如果我有9个记录,3组3个小组,每个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子句,但是该语句的结果不正确,并返回所有行,而不是返回分组CaseKey的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中的每个记录,运行一个查询来查看同一个记录是否还有一个记录与更高的recordDate.如果是,则WHERE EXISTS语句通过并且记录被删除,否则WHERE语句失败,并且该记录是其自己的MAX recordDate.

谢谢WildPlasser,为了这种简单化的方法,我以某种方式吹起来.

解决方法

MAX有一个特殊属性:没有超过最大值的记录.所以我们可以删除具有相同CaseKey的记录的所有记录,但是存在更高的recordDate:
DELETE FROM ztable zt
WHERE EXISTS (
    SELECT *
    FROM ztable ex
    WHERE ex.CaseKey = zt.CaseKey
    AND ex.recordDate > zt.recordDate
    );

BTW:上述查询(以及MAX()版本)假设只有一个最大日期的记录.可能有关系

在关系的情况下,您需要为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)
        )
    );

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03