Gibt es eine prägnante Möglichkeit, einen zufälligen Datensatz aus einer SQL Server-Tabelle abzurufen?
Ich möchte meine Unit-Test-Daten randomisieren und suche daher nach einer einfachen Möglichkeit, eine zufällige ID aus einer Tabelle auszuwählen. Auf Englisch lautet die Auswahl "Wählen Sie eine ID aus der Tabelle aus, wobei die ID eine Zufallszahl zwischen der niedrigsten ID in der Tabelle und der höchsten ID in der Tabelle ist."
Ich kann keinen Weg finden, dies zu tun, ohne die Abfrage ausführen, auf einen Nullwert testen und dann erneut ausführen zu müssen, wenn Null.
Ideen?
sql-server
tsql
random
Jeremy
quelle
quelle
Antworten:
Ja
Erläuterung
NEWID()
Für jede Zeile wird A generiert und die Tabelle danach sortiert. Der erste Datensatz wird zurückgegeben (dh der Datensatz mit der "niedrigsten" GUID).Anmerkungen
GUIDs werden seit Version vier als Pseudozufallszahlen generiert:
- Ein UUID-URN-Namespace (Universally Unique IDentifier) - RFC 4122
Die Alternative
SELECT TOP 1 * FROM table ORDER BY RAND()
wird nicht so funktionieren, wie man denkt.RAND()
Gibt einen einzelnen Wert pro Abfrage zurück, sodass alle Zeilen denselben Wert haben.Während GUID-Werte pseudozufällig sind, benötigen Sie für die anspruchsvolleren Anwendungen ein besseres PRNG.
Die typische Leistung für weniger als 1.000.000 Zeilen beträgt weniger als 10 Sekunden - natürlich je nach System. Beachten Sie, dass es unmöglich ist, einen Index zu erreichen, sodass die Performance relativ begrenzt ist.
quelle
Bei größeren Tabellen können Sie dies auch verwenden
TABLESAMPLE
, um das Scannen der gesamten Tabelle zu vermeiden.Dies
ORDER BY NEWID
ist weiterhin erforderlich, um zu vermeiden, dass nur Zeilen zurückgegeben werden, die zuerst auf der Datenseite angezeigt werden.Die zu verwendende Nummer muss für die Größe und Definition der Tabelle sorgfältig ausgewählt werden. Wenn keine Zeile zurückgegeben wird, können Sie eine Wiederholungslogik in Betracht ziehen. Die Mathematik dahinter und warum die Technik nicht für kleine Tabellen geeignet ist , wird hier diskutiert
quelle
TOP 1
es keine Rolle, ob Zeilen auf derselben Seite korreliert sind oder nicht. Sie wählen nur einen von ihnen aus.Versuchen Sie auch Ihre Methode, um eine zufällige ID zwischen MIN (Id) und MAX (Id) zu erhalten
Sie erhalten immer eine Zeile.
quelle
Wenn Sie große Datenmengen auswählen möchten, ist der beste Weg, den ich kenne, Folgendes:
Quelle: MSDN
quelle
Ich wollte die Methoden verbessern, die ich ausprobiert hatte, und bin auf diesen Beitrag gestoßen. Mir ist klar, dass es alt ist, aber diese Methode ist nicht aufgeführt. Ich erstelle und wende Testdaten an. Dies zeigt die Methode für "Adresse" in einem SP, der mit @st aufgerufen wird (Zwei-Zeichen-Status).
quelle
Dies wird weiter unten erklärt:
quelle