Вы можете попытаться сделать номер строки по каждому userId и упорядочить по created_at
в подзапросе.
, затем удалить ID
для каждого userId по rn
Из моегоНапример, я сохраняю только первую строку наименьшего значения, поэтому я задаю rn > 1
CREATE TABLE T(
id int,
user_id int,
amount int,
type varchar(50),
total_balance int,
created_at datetime
);
insert into T values (1,101,10 ,'debit',90 ,'2018-09-14 20:10:49');
insert into T values (2,101,30 ,'credit',120,'2018-09-14 20:10:52');
insert into T values (7,101,30 ,'credit',120,'2018-09-16 20:10:52');
insert into T values (3,102,210,'credit',310,'2018-09-14 21:10:52');
insert into T values (4,102,10 ,'debit',300,'2018-09-14 21:10:54');
insert into T values (5,103,10 ,'credit',110,'2018-09-14 21:10:54');
insert into T values (6,104,15 ,'credit',115,'2018-09-14 21:11:59');
DELETE FROM T
WHERE ID IN (
SELECT ID
FROM
(
SELECT ID,(
SELECT COUNT(*)
FROM T tt
WHERE
tt.user_id = t1.user_id
AND
tt.created_at >= t1.created_at
ORDER BY
tt.created_at desc
) rn
FROM T t1
) deltable
where rn > 1 # n least rows you want to keep.
);
Запрос 1 :
SELECT * FROM T
Результаты :
| id | user_id | amount | type | total_balance | created_at |
|----|---------|--------|--------|---------------|----------------------|
| 7 | 101 | 30 | credit | 120 | 2018-09-16T20:10:52Z |
| 4 | 102 | 10 | debit | 300 | 2018-09-14T21:10:54Z |
| 5 | 103 | 10 | credit | 110 | 2018-09-14T21:10:54Z |
| 6 | 104 | 15 | credit | 115 | 2018-09-14T21:11:59Z |