Как удалить все записи из таблицы, кроме первых 5 - PullRequest
0 голосов
/ 12 декабря 2018

Я пишу простую игру-викторину на python, и мне нужно распечатать 5 лучших результатов в конце игры.Я использую sqlite.У меня есть таблица наивысших баллов, и я решил, как получить наивысшие баллы, но поскольку мне нужны только первые 5 баллов, я хотел бы удалить все записи с баллами ниже, чем верхние 5. Возможно ли это с помощью SQLЗаявление или мне нужно написать его на Python.

Спасибо

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

У меня есть сильное отвращение к NOT IN с подзапросом, потому что он не ведет себя, как ожидалось, если любой из значений score отрицателен.Поэтому я бы порекомендовал:

DELETE FROM t
WHERE score < (SELECT DISTINCT t2.score
                FROM t2
                ORDER BY t2.score DESC
                LIMIT 1 OFFSET 4
               );
0 голосов
/ 12 декабря 2018

Вот один из вариантов:

DELETE
FROM yourTable
WHERE score NOT IN (SELECT DISTINCT score
                    FROM yourTable
                    ORDER BY score DESC LIMIT 5);

Этот ответ будет устойчивым к связям в топ-5, но будет иметь поведение при возвращении, возможно, более 5 записей, причем все эти записи будут иметь оценку вверхние 5 в целом.

Если бы было доступно ROW_NUMBER, мы могли бы попробовать что-то вроде:

WITH cte AS (
    SELECT id, score, ROW_NUMBER() OVER (ORDER BY score DESC) rn
    FROM yourTable
)

DELETE
FROM yourTable
WHERE id IN (SELECT id FROM cte WHERE rn <= 5);

Опять же, возникает вопрос о том, как обращаться со связями.Возможно, вы захотите использовать DENSE_RANK вместо ROW_NUMBER.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...