ตัวอย่างสุ่มอย่างง่ายจากฐานข้อมูล Sql


93

ฉันจะใช้ตัวอย่างสุ่มอย่างง่ายที่มีประสิทธิภาพใน SQL ได้อย่างไร ฐานข้อมูลที่เป็นปัญหากำลังเรียกใช้ MySQL ตารางของฉันมีอย่างน้อย 200,000 แถวและฉันต้องการตัวอย่างสุ่มอย่างง่ายประมาณ 10,000

คำตอบที่ "ชัดเจน" คือ:

SELECT * FROM table ORDER BY RAND() LIMIT 10000

สำหรับตารางขนาดใหญ่มันช้าเกินไปมันเรียกRAND()ทุกแถว (ซึ่งวางไว้ที่ O (n)) แล้วเรียงลำดับทำให้เป็น O (n lg n) ได้ดีที่สุด มีวิธีทำเร็วกว่า O (n) หรือไม่?

หมายเหตุ : ในฐานะที่เป็นแอนดรูเหมาชี้ให้เห็นในความคิดเห็นที่หากคุณใช้วิธีการนี้ใน SQL Server คุณควรใช้ฟังก์ชั่น T-SQL NEWID()เพราะ RAND () อาจจะกลับมาเป็นค่าเดียวกันสำหรับทุกแถว

แก้ไข: 5 ปีต่อมา

ฉันพบปัญหานี้อีกครั้งด้วยตารางที่ใหญ่กว่าและลงเอยด้วยการใช้โซลูชันของ @ ignorant เวอร์ชันที่มีการปรับแต่งสองอย่าง:

  • สุ่มตัวอย่างแถวเป็น 2-5x ขนาดตัวอย่างที่ฉันต้องการเพื่อราคาถูก ORDER BY RAND()
  • บันทึกผลลัพธ์ของRAND()คอลัมน์ที่จัดทำดัชนีในทุกการแทรก / อัปเดต (หากชุดข้อมูลของคุณไม่ได้อัปเดตมากนักคุณอาจต้องหาวิธีอื่นในการทำให้คอลัมน์นี้ใหม่อยู่เสมอ)

ในการรับตัวอย่างตาราง 1,000 รายการฉันนับแถวและสุ่มตัวอย่างผลลัพธ์โดยเฉลี่ย 10,000 แถวด้วยคอลัมน์ frozen_rand:

SELECT COUNT(*) FROM table; -- Use this to determine rand_low and rand_high

  SELECT *
    FROM table
   WHERE frozen_rand BETWEEN %(rand_low)s AND %(rand_high)s
ORDER BY RAND() LIMIT 1000

(การนำไปใช้งานจริงของฉันเกี่ยวข้องกับการทำงานมากขึ้นเพื่อให้แน่ใจว่าฉันไม่ได้ขีดล่างและต้องพัน rand_high ด้วยตนเอง แต่แนวคิดพื้นฐานคือ "สุ่มตัด N ของคุณให้เหลือไม่กี่พัน")

แม้ว่าสิ่งนี้จะทำให้เสียสละ แต่ก็ช่วยให้ฉันสามารถสุ่มตัวอย่างฐานข้อมูลโดยใช้การสแกนดัชนีจนกว่าจะมีขนาดเล็กพอที่จะORDER BY RAND()อีกครั้ง


3
นั่นไม่ได้ทำงานในเซิร์ฟเวอร์ SQL เนื่องจากRAND()ส่งคืนค่าเดียวกันทุกครั้งที่โทรตามมา
Andrew Mao

1
จุดดี - ฉันจะเพิ่มหมายเหตุว่าผู้ใช้ SQL Server ควรใช้ ORDER BY NEWID () แทน
ojrac

มันยังคงไม่มีประสิทธิภาพอย่างมากเพราะต้องเรียงลำดับข้อมูลทั้งหมด เทคนิคการสุ่มตัวอย่างสำหรับเปอร์เซ็นต์บางส่วนนั้นดีกว่า แต่หลังจากอ่านบทความจำนวนมากที่นี่ฉันก็ยังไม่พบวิธีแก้ปัญหาที่ยอมรับได้ว่าเป็นการสุ่มอย่างเพียงพอ
Andrew Mao

หากคุณอ่านคำถามฉันกำลังถามเป็นพิเศษเพราะ ORDER BY RAND () คือ O (n lg n)
ojrac

คำตอบของ muposat ด้านล่างนี้ดีมากหากคุณไม่หมกมุ่นอยู่กับการสุ่มทางสถิติของ RAND () มากเกินไป
Josh Greifer

คำตอบ:


25

มีการอภิปรายที่น่าสนใจเกี่ยวกับปัญหาประเภทนี้ที่นี่: http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/

ฉันคิดว่าโดยไม่มีสมมติฐานใด ๆ เกี่ยวกับตารางว่าโซลูชัน O (n lg n) ของคุณดีที่สุด แม้ว่าจริงๆแล้วด้วยเครื่องมือเพิ่มประสิทธิภาพที่ดีหรือเทคนิคที่แตกต่างกันเล็กน้อยการสืบค้นที่คุณแสดงรายการอาจดีกว่าเล็กน้อย O (m * n) โดยที่ m คือจำนวนแถวสุ่มที่ต้องการเนื่องจากไม่จำเป็นต้องเรียงอาร์เรย์ขนาดใหญ่ทั้งหมด มันสามารถค้นหา m ครั้งที่เล็กที่สุดได้ แต่สำหรับการเรียงลำดับตัวเลขที่คุณโพสต์ m จะใหญ่กว่า lg n อยู่ดี

สามความคาดหวังที่เราอาจลองใช้:

  1. มีคีย์หลักที่ไม่ซ้ำกันซึ่งจัดทำดัชนีแล้วในตาราง

  2. จำนวนแถวสุ่มที่คุณต้องการเลือก (m) น้อยกว่าจำนวนแถวในตาราง (n) มาก

  3. คีย์หลักที่ไม่ซ้ำกันคือจำนวนเต็มที่มีตั้งแต่ 1 ถึง n โดยไม่มีช่องว่าง

ด้วยสมมติฐานที่ 1 และ 2 เท่านั้นฉันคิดว่าสิ่งนี้สามารถทำได้ใน O (n) แม้ว่าคุณจะต้องเขียนดัชนีทั้งหมดลงในตารางเพื่อให้ตรงกับสมมติฐานที่ 3 ดังนั้นจึงไม่จำเป็นต้องเป็น O (n) ที่รวดเร็ว ถ้าเราสามารถสมมติอย่างอื่นที่ดีเกี่ยวกับตารางเพิ่มเติมได้เราสามารถทำงานใน O (m log m) อัสสัมชัญ 3 เป็นคุณสมบัติเพิ่มเติมที่ดีในการทำงานด้วย ด้วยตัวสร้างตัวเลขสุ่มที่ดีซึ่งรับประกันว่าจะไม่มีการซ้ำกันเมื่อสร้างตัวเลข m ในแถวจะเป็นไปได้

จากสมมติฐานสามข้อแนวคิดพื้นฐานคือการสร้างตัวเลขสุ่มเฉพาะ m ระหว่าง 1 ถึง n จากนั้นเลือกแถวที่มีคีย์เหล่านั้นจากตาราง ตอนนี้ฉันไม่มี mysql หรืออะไรอยู่ข้างหน้าดังนั้นในรหัสเทียมเล็กน้อยสิ่งนี้จะมีลักษณะดังนี้:


create table RandomKeys (RandomKey int)
create table RandomKeysAttempt (RandomKey int)

-- generate m random keys between 1 and n
for i = 1 to m
  insert RandomKeysAttempt select rand()*n + 1

-- eliminate duplicates
insert RandomKeys select distinct RandomKey from RandomKeysAttempt

-- as long as we don't have enough, keep generating new keys,
-- with luck (and m much less than n), this won't be necessary
while count(RandomKeys) < m
  NextAttempt = rand()*n + 1
  if not exists (select * from RandomKeys where RandomKey = NextAttempt)
    insert RandomKeys select NextAttempt

-- get our random rows
select *
from RandomKeys r
join table t ON r.RandomKey = t.UniqueKey

หากคุณกังวลเกี่ยวกับประสิทธิภาพจริงๆคุณอาจพิจารณาทำการสร้างคีย์แบบสุ่มในภาษาขั้นตอนบางประเภทและแทรกผลลัพธ์ลงในฐานข้อมูลเนื่องจากเกือบทุกอย่างนอกเหนือจาก SQL น่าจะดีกว่าในการเรียงลำดับของการวนซ้ำและการสร้างตัวเลขแบบสุ่มที่จำเป็น .


ฉันขอแนะนำให้เพิ่มดัชนีที่ไม่ซ้ำกันในการเลือกคีย์แบบสุ่มและอาจละเว้นรายการที่ซ้ำกันในส่วนแทรกจากนั้นคุณสามารถกำจัดสิ่งที่แตกต่างออกไปและการเข้าร่วมจะเร็วขึ้น
Sam Saffron

ฉันคิดว่าอัลกอริทึมตัวเลขสุ่มสามารถใช้การปรับแต่งบางอย่าง - ไม่ว่าจะเป็นข้อ จำกัด ที่ไม่ซ้ำกันตามที่กล่าวไว้หรือเพียงแค่สร้างตัวเลข 2 * m และเลือก DISTINCT, ORDER BY id (มาก่อนได้ก่อน - ให้บริการดังนั้นสิ่งนี้จะลดลงเป็นข้อ จำกัด ที่ไม่ซ้ำกัน ) LIMIT ม. ฉันชอบมัน.
ojrac

สำหรับการเพิ่มดัชนีที่ไม่ซ้ำกันในการเลือกคีย์แบบสุ่มแล้วละเว้นรายการที่ซ้ำกันในการแทรกฉันคิดว่านี่อาจทำให้คุณกลับไปที่พฤติกรรม O (m ^ 2) แทนที่จะเป็น O (m lg m) สำหรับการจัดเรียง ไม่แน่ใจว่าเซิร์ฟเวอร์จะรักษาดัชนีได้อย่างมีประสิทธิภาพเพียงใดเมื่อแทรกแถวสุ่มทีละแถว
user12861

สำหรับคำแนะนำในการสร้างตัวเลข 2 * ม. หรือบางอย่างฉันต้องการอัลกอริทึมที่รับประกันว่าจะทำงานไม่ว่าจะเกิดอะไรขึ้น มีโอกาส (บางเฉียบ) เสมอที่ตัวเลขสุ่ม 2 * ม. ของคุณจะมีรายการซ้ำกันมากกว่า m ดังนั้นคุณจะมีไม่เพียงพอสำหรับข้อความค้นหาของคุณ
user12861

1
คุณจะได้รับจำนวนแถวในตารางได้อย่างไร?
Awesome-o

54

ฉันคิดว่าวิธีแก้ปัญหาที่เร็วที่สุดคือ

select * from table where rand() <= .3

นี่คือเหตุผลที่ฉันคิดว่านี่ควรจะทำงานได้ดี

  • มันจะสร้างตัวเลขสุ่มสำหรับแต่ละแถว ตัวเลขอยู่ระหว่าง 0 ถึง 1
  • จะประเมินว่าจะแสดงแถวนั้นหรือไม่หากตัวเลขที่สร้างขึ้นอยู่ระหว่าง 0 ถึง. 3 (30%)

สิ่งนี้ถือว่า Rand () กำลังสร้างตัวเลขในการแจกแจงแบบสม่ำเสมอ เป็นวิธีที่เร็วที่สุดในการดำเนินการนี้

ฉันเห็นว่ามีคนแนะนำวิธีแก้ปัญหานั้นและพวกเขาถูกยิงโดยไม่มีข้อพิสูจน์ .. นี่คือสิ่งที่ฉันจะพูดกับมัน

  • นี่คือ O (n) แต่ไม่จำเป็นต้องมีการเรียงลำดับดังนั้นจึงเร็วกว่า O (n lg n)
  • mysql มีความสามารถในการสร้างตัวเลขสุ่มสำหรับแต่ละแถว ลองสิ่งนี้ -

    เลือก Rand () จาก INFORMATION_SCHEMA.TABLES ขีด จำกัด 10;

เนื่องจากฐานข้อมูลที่เป็นปัญหาคือ mySQL จึงเป็นทางออกที่เหมาะสม


1
ขั้นแรกคุณมีปัญหาว่าสิ่งนี้ไม่สามารถตอบคำถามได้จริงเนื่องจากได้รับผลลัพธ์ที่เป็นตัวเลขกึ่งสุ่มใกล้เคียงกับตัวเลขที่ต้องการ แต่ไม่จำเป็นต้องเป็นตัวเลขนั้นทั้งหมดแทนที่จะเป็นจำนวนผลลัพธ์ที่ต้องการอย่างแม่นยำ
user12861

1
ถัดไปตามประสิทธิภาพของคุณคือ O (n) โดยที่ n คือจำนวนแถวในตาราง นั่นยังไม่ดีเท่า O (m log m) โดยที่ m คือจำนวนผลลัพธ์ที่คุณต้องการและ m << n คุณยังคงพูดถูกว่ามันจะเร็วกว่าในทางปฏิบัติเพราะอย่างที่คุณบอกว่าการสร้างแรนด์และเปรียบเทียบกับค่าคงที่อาจเร็วมาก คุณต้องทดสอบเพื่อหาคำตอบ ด้วยโต๊ะที่เล็กกว่าคุณอาจชนะ ด้วยโต๊ะขนาดใหญ่และผลลัพธ์ที่ต้องการจำนวนน้อยกว่ามากฉันไม่แน่ใจ
user12861

1
ในขณะที่ @ user12861 พูดถูกเกี่ยวกับเรื่องนี้ไม่ได้รับตัวเลขที่ถูกต้อง แต่ก็เป็นวิธีที่ดีในการตัดชุดข้อมูลให้มีขนาดคร่าวๆที่เหมาะสม
ojrac

1
ฐานข้อมูลให้บริการแบบสอบถามต่อไปนี้SELECT * FROM table ORDER BY RAND() LIMIT 10000 อย่างไร- ? ก่อนอื่นต้องสร้างหมายเลขสุ่มสำหรับแต่ละแถว (เหมือนกับวิธีการแก้ปัญหาที่ฉันอธิบายไว้) จากนั้นสั่งซื้อ .. แปลก! นี่คือสาเหตุที่การแก้ปัญหานี้จะช้ากว่าที่ฉันอธิบายไว้เนื่องจากไม่จำเป็นต้องมีประเภทใด ๆ คุณสามารถเพิ่มขีด จำกัด ให้กับโซลูชันที่ฉันอธิบายไว้และจะไม่ให้จำนวนแถวมากกว่านั้น เนื่องจากมีคนชี้ให้เห็นอย่างถูกต้องจะไม่ให้ขนาดตัวอย่างที่แน่นอน แต่สำหรับตัวอย่างแบบสุ่ม EXACT มักไม่ใช่ข้อกำหนดที่เข้มงวด
ไม่รู้

มีวิธีระบุจำนวนแถวขั้นต่ำหรือไม่?
CMCDragonkai

5

เห็นได้ชัดว่าใน SQL บางเวอร์ชันมีTABLESAMPLEคำสั่ง แต่ไม่มีในการใช้งาน SQL ทั้งหมด (โดยเฉพาะอย่างยิ่ง Redshift)

http://technet.microsoft.com/en-us/library/ms189108(v=sql.105).aspx


เด็ดมาก! ดูเหมือนว่า PostgreSQL หรือ MySQL / MariaDB ไม่ได้ใช้งาน แต่ก็เป็นคำตอบที่ดีหากคุณใช้งาน SQL ที่รองรับ
ojrac

ฉันเข้าใจว่านั่นTABLESAMPLEไม่ใช่การสุ่มในความหมายทางสถิติ
Sean

4

เพียงแค่ใช้

WHERE RAND() < 0.1 

เพื่อรับ 10% ของบันทึกหรือ

WHERE RAND() < 0.01 

เพื่อรับ 1% ของบันทึก ฯลฯ


1
ซึ่งจะเรียก RAND สำหรับทุกแถวทำให้เป็น O (n) ผู้โพสต์กำลังมองหาสิ่งที่ดีกว่านั้น
user12861

1
ไม่เพียงแค่นั้น แต่RAND()ส่งคืนค่าเดียวกันสำหรับการโทรครั้งต่อ ๆ ไป (อย่างน้อยบน MSSQL) ซึ่งหมายความว่าคุณจะได้รับทั้งตารางหรือไม่มีเลยด้วยความน่าจะเป็นนั้น
Andrew Mao

4

เร็วกว่าการสั่งซื้อโดย RAND ()

ฉันทดสอบวิธีนี้ว่าเร็วกว่าORDER BY RAND()มากดังนั้นจึงทำงานในเวลาO (n)และทำได้เร็วอย่างน่าประทับใจ

จากhttp://technet.microsoft.com/en-us/library/ms189108%28v=sql.105%29.aspx :

เวอร์ชันที่ไม่ใช่ MSSQL - ฉันไม่ได้ทดสอบสิ่งนี้

SELECT * FROM Sales.SalesOrderDetail
WHERE 0.01 >= RAND()

เวอร์ชัน MSSQL:

SELECT * FROM Sales.SalesOrderDetail
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float) / CAST (0x7fffffff AS int)

ซึ่งจะเลือก ~ 1% ของระเบียน ดังนั้นหากคุณต้องการเลือก # เปอร์เซ็นต์หรือเรกคอร์ดที่แน่นอนให้ประเมินเปอร์เซ็นต์ของคุณด้วยขอบนิรภัยบางส่วนจากนั้นสุ่มดึงบันทึกส่วนเกินจากชุดผลลัพธ์โดยใช้ORDER BY RAND()วิธีที่แพงกว่า

เร็วยิ่งขึ้น

ฉันสามารถปรับปรุงวิธีนี้ให้ดียิ่งขึ้นไปอีกเพราะฉันมีช่วงค่าคอลัมน์ที่จัดทำดัชนีที่รู้จักกันดี

ตัวอย่างเช่นหากคุณมีคอลัมน์ที่จัดทำดัชนีซึ่งมีจำนวนเต็มแบบกระจายสม่ำเสมอ [0..max] คุณสามารถใช้คอลัมน์นั้นเพื่อสุ่มเลือก N ช่วงเวลาเล็ก ๆ ทำสิ่งนี้แบบไดนามิกในโปรแกรมของคุณเพื่อรับชุดที่แตกต่างกันสำหรับการเรียกใช้แบบสอบถามแต่ละครั้ง การเลือกชุดย่อยนี้จะเป็นO (N)ซึ่งสามารถสั่งซื้อขนาดเล็กกว่าชุดข้อมูลทั้งหมดของคุณได้หลายคำสั่ง

ในการทดสอบของฉันฉันลดเวลาที่ต้องใช้ในการรับบันทึกตัวอย่าง 20 (จาก 20 ล้าน) จาก3 นาทีโดยใช้ ORDER BY RAND () เหลือ0.0 วินาที !


1

ฉันต้องการชี้ให้เห็นว่าโซลูชันทั้งหมดเหล่านี้ดูเหมือนจะเป็นตัวอย่างโดยไม่ต้องเปลี่ยน การเลือกแถว K บนสุดจากการจัดเรียงแบบสุ่มหรือการเข้าร่วมกับตารางที่มีคีย์ที่ไม่ซ้ำกันตามลำดับแบบสุ่มจะทำให้ได้ตัวอย่างสุ่มที่สร้างขึ้นโดยไม่มีการแทนที่

หากคุณต้องการให้ตัวอย่างของคุณเป็นอิสระคุณจะต้องสุ่มตัวอย่างด้วยการเปลี่ยน ดูคำถาม 25451034สำหรับตัวอย่างหนึ่งของวิธีดำเนินการโดยใช้ JOIN ในลักษณะที่คล้ายกับโซลูชันของ user12861 โซลูชันนี้เขียนขึ้นสำหรับ T-SQL แต่แนวคิดทำงานใน SQL db ใด ๆ


0

เริ่มจากการสังเกตว่าเราสามารถดึงรหัสของตาราง (เช่น count 5) ตามชุด:

select *
from table_name
where _id in (4, 1, 2, 5, 3)

เราสามารถมาถึงผลที่ตามมาว่าถ้าเราสามารถสร้างสตริงแล้วเราจะมีวิธีที่มีประสิทธิภาพมากกว่า"(4, 1, 2, 5, 3)"RAND()

ตัวอย่างเช่นใน Java:

ArrayList<Integer> indices = new ArrayList<Integer>(rowsCount);
for (int i = 0; i < rowsCount; i++) {
    indices.add(i);
}
Collections.shuffle(indices);
String inClause = indices.toString().replace('[', '(').replace(']', ')');

หากรหัสมีช่องว่างรายการอาร์เรย์เริ่มต้นindicesจะเป็นผลลัพธ์ของแบบสอบถาม sql บนรหัส


0

หากคุณต้องการmแถวตรงตามความเป็นจริงคุณจะสร้างชุดย่อยของ ID ของคุณนอก SQL เมธอดส่วนใหญ่ต้องการในบางจุดเพื่อเลือกรายการ "ที่ n" และตาราง SQL ไม่ใช่อาร์เรย์เลย สมมติฐานที่ว่าคีย์จะติดต่อกันเพื่อเพียงเข้าร่วม ints สุ่มระหว่าง 1 และนับยังเป็นเรื่องยากที่จะตอบสนองความ - MySQL เช่นไม่สนับสนุนกำเนิดและเงื่อนไขล็อคที่มี ... หากิน

นี่คือโซลูชัน -time O(max(n, m lg n)), O(n)-space โดยสมมติว่าเป็นปุ่ม BTREE ธรรมดา:

  1. ดึงค่าทั้งหมดของคอลัมน์คีย์ของตารางข้อมูลตามลำดับใด ๆ ลงในอาร์เรย์ในภาษาสคริปต์ที่คุณชื่นชอบในรูปแบบ O(n)
  2. ทำการสับเปลี่ยน Fisher-Yatesหยุดหลังจากการmแลกเปลี่ยนและแยก subarray [0:m-1]เข้ามาϴ(m)
  3. "เข้าร่วม" subarray กับชุดข้อมูลเดิม (เช่นSELECT ... WHERE id IN (<subarray>)) ในO(m lg n)

วิธีการใด ๆ ที่สร้างชุดย่อยแบบสุ่มนอก SQL ต้องมีความซับซ้อนนี้เป็นอย่างน้อย การเข้าร่วมไม่สามารถเร็วไปกว่าO(m lg n)BTREE ได้ (ดังนั้นการO(m)อ้างสิทธิ์จึงเป็นเรื่องเพ้อฝันสำหรับเอนจิ้นส่วนใหญ่) และการสับเปลี่ยนจะอยู่ด้านล่างnและm lg nไม่ส่งผลต่อพฤติกรรมที่ไม่แสดงอาการ

ใน Pythonic pseudocode:

ids = sql.query('SELECT id FROM t')
for i in range(m):
  r = int(random() * (len(ids) - i))
  ids[i], ids[i + r] = ids[i + r], ids[i]

results = sql.query('SELECT * FROM t WHERE id IN (%s)' % ', '.join(ids[0:m-1])

0

เลือก 3000 ระเบียนแบบสุ่มใน Netezza:

WITH IDS AS (
     SELECT ID
     FROM MYTABLE;
)

SELECT ID FROM IDS ORDER BY mt_random() LIMIT 3000

นอกเหนือจากการเพิ่มบันทึกเฉพาะภาษาของ SQL ฉันไม่คิดว่าสิ่งนี้จะตอบคำถามเกี่ยวกับวิธีการค้นหาตัวอย่างสุ่มของแถวโดยไม่ต้อง 'ORDER BY rand () LIMIT $ 1'
ojrac

0

ลอง

SELECT TOP 10000 * FROM table ORDER BY NEWID()

สิ่งนี้จะให้ผลลัพธ์ที่ต้องการโดยไม่ซับซ้อนเกินไปหรือไม่?


โปรดสังเกตว่าNEWID()เฉพาะสำหรับ T-SQL
Peter O.

ขอโทษด้วย. มันคือ. ขอบคุณอย่างไรก็ตามจะมีประโยชน์ที่จะทราบว่ามีใครมาที่นี่และมองหาวิธีที่ดีกว่านี้และ IS โดยใช้ T-SQL
Northernlad

ORDER BY NEWID()มีหน้าที่เหมือนกับORDER BY RAND()- เรียกRAND()ทุกแถวในเซต - O (n) - แล้วเรียงลำดับสิ่งทั้งหมด - O (n lg n) กล่าวอีกนัยหนึ่งนั่นคือวิธีแก้ปัญหาในกรณีที่เลวร้ายที่สุดที่คำถามนี้ต้องการปรับปรุง
ojrac

0

ในบางภาษาเช่น Microsoft SQL Server, PostgreSQL และ Oracle (แต่ไม่ใช่ MySQL หรือ SQLite) คุณสามารถทำสิ่งต่างๆเช่น

select distinct top 10000 customer_id from nielsen.dbo.customer TABLESAMPLE (20000 rows) REPEATABLE (123);

เหตุผลที่ไม่เพียง แต่ทำ(10000 rows)โดยไม่มีเหตุผลก็topคือTABLESAMPLEตรรกะจะให้จำนวนแถวที่ไม่แน่นอนมาก (เช่นบางครั้ง 75% ที่บางครั้ง 1.25% เท่านั้น) ดังนั้นคุณจึงต้องการเพิ่มจำนวนมากเกินไปและเลือกจำนวนที่แน่นอนที่คุณต้องการ REPEATABLE (123)สำหรับการให้เมล็ดพันธุ์แบบสุ่ม


-4

บางทีคุณอาจทำได้

SELECT * FROM table LIMIT 10000 OFFSET FLOOR(RAND() * 190000)

1
ดูเหมือนว่าจะเลือกส่วนข้อมูลของฉันแบบสุ่ม ฉันกำลังมองหาบางสิ่งที่ซับซ้อนขึ้นเล็กน้อย - 10,000 แถวแบบสุ่ม
ojrac

จากนั้นตัวเลือกเดียวของคุณหากคุณต้องการทำในฐานข้อมูลคือ ORDER BY Rand ()
สถิติ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.