2011-05-17 27 views
7

下午好,我們想知道如何隨意刪除15000行sqlite表中20%的行。我們注意到這個問題在Stack Overflow中使用SQL Server Select n random rows from SQL Server table解決。 但SQL Server腳本似乎不能在sqlite中正常工作。我們如何才能將SQL Server腳本轉換爲等效的sqlite腳本?謝謝。如何在SQLite表中隨機刪除20%的行

+0

[Kevin Peno的回答](https://stackoverflow.com/a/6037746/2932052)有什麼不對? – Wolf 2018-01-17 15:42:26

回答

5

或者,由於在源碼隨機()函數返回一個有符號的64位整數,我們可以此空間(2^63)* 0.6內計算的點。大於這個的簽名整數將是正整數64位整數集合的40%,因此整個集合的20%。

截斷爲下面的整數,這是5534023222112865484。

因此,你應該能夠得到您行的20%,用一個簡單的:

SELECT * FROM table WHERE random() > 5534023222112865485 

或者在你的情況下,因爲要刪除很多:

DELETE FROM table WHERE random() > 5534023222112865485 

我希望你享受這種做法。如果你想從這樣的操作獲得高性能,它可能確實是合適的,但它可能依賴於硬件/版本,因此可能不值得冒這個風險。

+0

謝謝你的回覆。我只是試圖接受你的答案。一旦我們運行DELETE FROM table WHERE random()> 5534023222112865485,表中的rowid將會出現空隙。你知道要運行哪些sqlite語句來關閉rowid間隔嗎?謝謝。 – Frank 2011-05-18 01:13:28

+3

作爲一般的良好實踐,您不應該關心ROWID的實際值,以及序列中是否存在缺口。由於各種原因,數據庫在任何情況下最終都會在正常使用過程中出現序列差距。 例如,當你BEGIN;插;插;承諾;在你開始時在一個線程中;插; ROLLBACK;在另一個線程中,您最終可能會在ROWID中產生差距。 – karora 2011-05-18 02:17:46

+2

另外,正如有人在下面的評論中指出的那樣,使用WHERE(random()%5)= 0真的是一個更好的解決方案,因爲它不需要64位signed int ,而且它不具備依賴硬件/版本的潛力。 – karora 2011-05-18 02:21:31

4

不是'隨機' - 但如果你在桌面上有一個標識列,你可以在統計上刪除非常接近五分之一的行。

+0

@ Will A,謝謝你的回答。我剛接受你的回答。我們表中唯一的標識列是隱式的ROWID列。我們可以在你的答案中用ROWID替換ID嗎?謝謝你的建議。 – Frank 2011-05-17 22:23:19

+0

@弗蘭克 - 我的榮幸,先生。是的,ROWID會很好。 – 2011-05-17 22:26:31

+1

@Frank:你可以使用'rowid'。你也可以使用'WHERE random()%5 = 0'。 – 2011-05-17 22:27:17

3

嘗試:

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)

+0

@ user589993,謝謝你的回答。我剛接受你的回答。我們的sqlite表中沒有ID列。我們可以使用ROWID而不是ID?感謝您的幫助。 – Frank 2011-05-17 22:18:53

+0

是的,ROWID的工作原理是一樣的,看起來您接受了其他解決方案之一。 – garnertb 2011-05-17 22:21:09

+0

@ user589993,謝謝你的回答。我會馬上嘗試,讓你知道我們的結果。 – Frank 2011-05-17 22:26:30

2

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 
    ) 
); 
+0

謝謝你的回答。我剛接受你的回答。我們可以在您的答案中用ROWID替換ID。謝謝您的幫助。 – Frank 2011-05-17 22:29:44

+0

@弗蘭克,是的。儘管你只能接受一個答案。 – 2011-05-17 22:54:02

+0

我你試過你的答案。它工作正常。我注意到現在在ROWID中存在差距。是否有可能使ROWID再次連續?感謝您的幫助。 – Frank 2011-05-17 23:55:12