MariaDB unterstützt Window Funktionen:
https://mariadb.com/kb/en/window-functions-overview/
Auf dieser Seite gibt es ein Beispiel zur Verwendung der ROW_NUMBER window funktion.
Mittels der ROW_NUMBER läßt sich dann eine WHERE-Bedingung für das DELETE angeben:
DELETE FROM <...> WHERE rnum < 10
Aus der verlinkten Seite
Code:
First, let's order the records by email alphabetically, giving each an ascending rnum value starting with 1. This will make use of the ROW_NUMBER window function:
SELECT row_number() OVER (ORDER BY email) AS rnum,
email, first_name, last_name, account_type
FROM users ORDER BY email;
+------+------------------------+------------+-----------+--------------+
| rnum | email | first_name | last_name | account_type |
+------+------------------------+------------+-----------+--------------+
| 1 | admin@boss.org | Admin | Boss | admin |
| 2 | bob.carlsen@foo.bar | Bob | Carlsen | regular |
| 3 | eddie.stevens@data.org | Eddie | Stevens | regular |
| 4 | john.smith@xyz.org | John | Smith | regular |
| 5 | root@boss.org | Root | Chief | admin |
+------+------------------------+------------+-----------+--------------
Dadurch, dass man die Zeilennummer in rnum hat, kann man sie für das DELETE verwenden.
Ähnliches Beispiel:
https://stackoverflow.com/a/9123892/80901
Code:
WITH cte as(
SELECT ROW_NUMBER() OVER (PARTITION BY [specimen id]
ORDER BY quicklabdumpid DESC ) RN
FROM quicklabdump)
delete from cte where RN>1
In diesem Beispiel werden alle Datensätze mit RN > 1 gelöscht, d.h. die erste Zeile bleibt erhalten.
Wegen des JOIN auf die zweite Tabelle ist hier aber vermutlich noch ein kleiner Umbau notwendig.