【问题标题】:sql: Delete oldest n records from each groupsql:从每个组中删除最旧的 n 条记录
【发布时间】:2019-09-12 23:45:56
【问题描述】:

我正在使用 cockroachdb。 对于每个组(按id字段分组),如果记录数超过1000,我想删除最旧的however_many记录,以便删除后的记录数等于1000。

这是我目前所拥有的:

(select id, count(*) - 1000 as num_delete
    from db.table
    group by id
    having count(*) > 1000)

这给了我要删除记录的 ID,以及我需要删除的记录数。

         id | num_delete  
+-----------+------------+
  n7ia6ryc  |        437 

有没有一种方法,使用一个 sql 语句,我可以添加到上面的 sql 查询中,以便删除这些记录?

【问题讨论】:

    标签: sql cockroachdb


    【解决方案1】:

    我不知道这是否适用于 CockroachDB。如果你有一列是唯一的,那么你可以这样做:

    delete from t
        where t.unique_col < (select t2.unique_col
                              from t t2
                              where t2.id = t.id
                              order by t2.unique_col
                              fetch first 1 row only offset 99 rows
                             );
    

    这会为每个 id 找到“unique_col”的 100 秒值,然后删除所有具有较小值的行(具有相同的 id)。

    如果没有 100 个值,则子查询返回 NULL 并且不会删除任何内容。

    【讨论】:

    • 你能解释一下你在这里做了什么吗?
    • 谢谢,只是为了确定一下,“唯一列”是什么意思?
    • 哦(明白了),您的意思是所有唯一值?比如时间戳?
    • @Jobs 。 . . timestamp 可能很好。名为id 的东西通常是候选对象,但显然有重复项。
    • 知道了。还有一件事:您的意思是说 1000 和 999(相对于 100 和 99)?另外,如果我理解正确,这难道不是与我想要做的相反吗?假设有 1014 条记录属于给定的 id 组。我只想删除 14 条记录,剩下 1000 条,而不是删除 1000 条,只剩下 14 条。最后你能解释一下t2是从哪里来的吗?以前从未见过“from t t2”语法。谢谢。
    猜你喜欢
    • 2016-11-26
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多