Wie kann ich in reinem SQL eine zufällige Zeile anfordern (oder eine, die dem echten Zufall so nahe wie möglich kommt)?
Antworten
Zu viele Anzeigen?Siehe diesen Beitrag: SQL zur Auswahl einer zufälligen Zeile aus einer Datenbanktabelle . Es werden Methoden beschrieben, um dies in MySQL, PostgreSQL, Microsoft SQL Server, IBM DB2 und Oracle zu tun (das Folgende ist von diesem Link kopiert):
Wählen Sie mit MySQL eine beliebige Zeile aus:
SELECT column FROM table
ORDER BY RAND()
LIMIT 1
Wählen Sie eine zufällige Zeile mit PostgreSQL aus:
SELECT column FROM table
ORDER BY RANDOM()
LIMIT 1
Wählen Sie mit Microsoft SQL Server eine beliebige Zeile aus:
SELECT TOP 1 column FROM table
ORDER BY NEWID()
Auswahl einer zufälligen Zeile mit IBM DB2
SELECT column, RAND() as IDX
FROM table
ORDER BY IDX FETCH FIRST 1 ROWS ONLY
Wählen Sie mit Oracle einen zufälligen Datensatz aus:
SELECT column FROM
( SELECT column FROM table
ORDER BY dbms_random.value )
WHERE rownum = 1
Lösungen wie Jeremies:
SELECT * FROM table ORDER BY RAND() LIMIT 1
funktionieren, aber sie benötigen einen sequentiellen Scan der gesamten Tabelle (weil der Zufallswert für jede Zeile berechnet werden muss, damit die kleinste Zeile ermittelt werden kann), was selbst bei mittelgroßen Tabellen recht langsam sein kann. Meine Empfehlung wäre, eine Art indizierte numerische Spalte zu verwenden (viele Tabellen haben diese als Primärschlüssel), und dann etwas zu schreiben wie:
SELECT * FROM table WHERE num_value >= RAND() *
( SELECT MAX (num_value ) FROM table )
ORDER BY num_value LIMIT 1
Dies funktioniert in logarithmischer Zeit, unabhängig von der Tabellengröße, wenn num_value
indiziert ist. Ein Vorbehalt: Dies setzt voraus, dass num_value
ist gleichmäßig verteilt in dem Bereich 0..MAX(num_value)
. Wenn Ihr Datensatz stark von dieser Annahme abweicht, erhalten Sie verzerrte Ergebnisse (einige Zeilen werden häufiger als andere erscheinen).
Sie haben nicht gesagt, welchen Server Sie verwenden. In älteren Versionen von SQL Server können Sie dies verwenden:
select top 1 * from mytable order by newid()
In SQL Server 2005 und höher können Sie TABLESAMPLE
um eine Zufallsstichprobe zu erhalten, die wiederholbar ist:
SELECT FirstName, LastName
FROM Contact
TABLESAMPLE (1 ROWS) ;
- See previous answers
- Weitere Antworten anzeigen