Как удалить строки после группировки с максимальной производительностью - PullRequest
0 голосов
/ 17 января 2020

Приведена следующая таблица:

Table Before: TABLE_FOO

| TEST_ID | RUN_ID |
|---------|--------|
| 1000    | 10     | 
| 1000    | 11     |
| 1000    | 12     | <-- keep
| 2000    | 20     |
| 2000    | 21     | <-- keep
| 3000    | 30     | <-- keep

Мне нужно очистить все строки, где RUN_ID равно , а не максимальный идентификатор для TEST_ID, чтобы таблица выглядела как следующее:

Table After: TABLE_FOO

| TEST_ID | RUN_ID |
|---------|--------|
| 1000    | 12     |
| 2000    | 21     |
| 3000    | 30     |

Моя лучшая попытка на данный момент:

DELETE FROM TABLE_FOO 
WHERE RUN_ID NOT IN (SELECT MAX(RUN_ID) FROM TABLE_FOO GROUP BY TEST_ID)

Производительность имеет решающее значение. Вы думаете, что есть более быстрый / более эффективный способ?

Ответы [ 3 ]

1 голос
/ 17 января 2020

Этот запрос подтвердит список, который нужно удалить

Select * from tbl a where exists(select 1 from tbl b where a.test_Id = b.Test_id and a.RUN_ID  < b.RUN_ID )

Запрос на удаление, если вы уверены в списке,

Delete from tbl a where exists(select 1 from tbl b where a.test_Id = b.Test_id and a.RUN_ID  < b.RUN_ID )
1 голос
/ 17 января 2020

Я думаю, я бы go для:

delete from t
    where t.run_id <> (select max(t2.run_id) from t t2 where t2.test_id = t.test_id);

Это непосредственно захватывает логи c, которые вы ищете.

1 голос
/ 17 января 2020

Вам не нужно группировать или что-то еще. Просто используйте запрос ниже -

DELETE FROM TABLE_FOO T1
WHERE EXISTS (SELECT RUN_ID
              FROM TABLE_FOO T2
              WHERE T1.TEST_ID = T2.TEST_ID
              AND T1.RUN_ID < T2.RUN_ID)
...