Как случайно удалить 20% строк в таблице SQLite - PullRequest
7 голосов
/ 18 мая 2011

Добрый день. Нам было интересно, как случайно удалить 20% строк в таблице sqlite с 15000 строками. Мы заметили, что этот вопрос был решен в переполнении стека с использованием SQL Server Выберите n случайных строк из таблицы SQL Server . Но сценарий SQL Server не работает должным образом в sqlite. Как мы можем преобразовать сценарий SQL Server в SQL-эквивалентный сценарий? Спасибо.

Ответы [ 4 ]

5 голосов
/ 18 мая 2011

В качестве альтернативы, поскольку функция random () в sqlite возвращает 64-разрядное целое число со знаком, мы можем вычислить точку в этом пространстве как (2 ^ 63) * 0.6.Целые числа со знаком больше этого значения будут составлять 40% от набора 64-разрядных целых чисел с положительными знаками, поэтому 20% от всего набора.

Сокращение до целого числа ниже, это 5534023222112865484.

Следовательно, вы должны иметь возможность получить 20% своих строк с помощью простого:

   SELECT * FROM table WHERE random() > 5534023222112865485

Или в вашем случае, поскольку вы хотите удалить столько:

   DELETE FROM table WHERE random() > 5534023222112865485

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

4 голосов
/ 18 мая 2011

Не совсем «случайный» - но если у вас есть столбец идентификаторов в таблице, вы можете DELETE FROM mytable WHERE ID % 5 = 0, который должен статистически удалять очень близко к пятой части строк.

3 голосов
/ 18 мая 2011

Попробуйте:

DELETE FROM TABLE 
WHERE ROWID IN (SELECT ROWID FROM TABLE ORDER BY RANDOM() LIMIT 3000) 

Если вы хотите рассчитать 20% в подзапросе: LIMIT (SELECT CAST( ( COUNT(id) * 0.2 ) AS INT )

2 голосов
/ 18 мая 2011

SQLite - ORDER BY RAND () предоставляет подсказку.Таким образом, это может работать?

DELETE FROM table WHERE id IN(
    SELECT id FROM table ORDER BY RANDOM() LIMIT (
        SELECT CAST( ( COUNT(id) * 0.2 ) AS INT ) FROM table
    )
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...