【问题标题】:sqlite filtering by sumsqlite 按总和过滤
【发布时间】:2023-03-14 16:22:01
【问题描述】:

我有一个包含 1000 条记录的数据库,每行包含一个文件名和一个文件大小。 如果所有文件大小的总和超过特定限制,则: - 我需要创建一个 sql 查询来删除所有剩余的行,从最旧到最新

有什么建议吗? 谢谢

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    假设这样创建了一个表:

    CREATE TABLE Files (Id INTEGER PRIMARY KEY, FileName TEXT, CreationDate DATE, Size INTEGER);
    

    要获取运行总和,请使用以下查询:

    SELECT f1.id AS FileId, sum(f2.size) AS RunningSumSize
    FROM file f1 INNER JOIN file f2
    ON f1.createdDate<=f2.createdDate
    GROUP BY FileId
    ORDER BY RunningSumSize DESC;
    

    删除超过阈值的文件ID:

    DELETE FROM File WHERE Id IN
     (SELECT FileId FROM 
      (SELECT f1.id AS FileId, sum(f2.size) AS RunningSumSize
      FROM file f1 INNER JOIN file f2
      ON f1.createdDate<=f2.createdDate
      GROUP by FileId
      ORDER by RunningSumSize DESC)
      WHERE RunningSumSize > :ThresholdSize:);
    

    注意:order by 是可选的。

    【讨论】:

      【解决方案2】:

      可能最简单的解决方案(即使有很多行仍然很快)是在应用程序中计算运行总数:

      select createdDate, size from files order by createdDate desc
      

      现在读取结果集,并在循环中使用 total += size。总数变大后,删除比当前 createdDate 更早的所有内容:

      delete from files where createdDate < ?
      

      其他一些数据库(例如 MySQL 和 H2)支持高效的运行总计,但不支持 SQLite。

      【讨论】:

        【解决方案3】:

        进行二分查找。检查 500 个最新文件的总和是否小于限制,如果是,则 750 的总和是否低于限制等。直到您获得应该开始删除的行。然后只需DELETE WHERE file_date &gt; date_of_your_last_row_below_limit

        【讨论】:

        • 听起来不错,但我需要在 sql 语句中执行此操作。可以举个例子吗?
        猜你喜欢
        • 2016-04-15
        • 1970-01-01
        • 2019-04-01
        • 1970-01-01
        • 2018-09-16
        • 2021-01-21
        • 1970-01-01
        • 2020-08-25
        • 2016-04-23
        相关资源
        最近更新 更多