【问题标题】:SQL - delete all except the last N rows by serial_numbSQL - 通过 serial_numb 删除除最后 N 行之外的所有行
【发布时间】:2021-09-07 09:22:34
【问题描述】:

我有一个表,每个序列号每秒都有很多记录。我只想获取要保存的每个序列号的最后 10 条记录。

这是数据库的结构:

我正在尝试此代码,但出现错误:This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

DELETE
    FROM instant_data m1
    WHERE id NOT IN (SELECT m2.id
                     FROM instant_data m2
                     WHERE m2.serial_numb = m1.serial_numb
                     ORDER BY m2.id DESC
                     LIMIT 30);

【问题讨论】:

  • 什么是精确的 MariaDB 版本?
  • 5.5.61-MariaDB-38.13

标签: mysql sql mariadb


【解决方案1】:
DELETE instant_data 
FROM instant_data 
JOIN ( SELECT *, ROW_NUMBER() OVER (PARTITION BY serial_numb ORDER BY id DESC) rn 
       FROM instant_data  ) cte USING (id)
WHERE cte.rn > 10;

https://dbfiddle.uk/?rdbms=mariadb_10.6&fiddle=3a76cd142d538c7da687f595e0180729

【讨论】:

  • 太棒了!它可以工作,但是有没有办法用一个查询来做到这一点?
  • 我收到Something is wrong in your syntax near '(PARTITION BY serial_numb ORDER BY ID DESC) rn FROM instant_data) cte 'on line 3
  • @OscarFuentes 这不是 MySQL/MariaDB 错误消息,所以它是由使用的客户端产生的。获取从数据库服务器收到的原始消息。
  • 如何获取原始消息?
  • @OscarFuentes 使用命令行客户端(CLI、mysql.exe)执行此查询。或向您的客户咨询详细协议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
相关资源
最近更新 更多