2016-06-13 21 views
0

Schnell wollte fragen, dass der RAND() Operator die Werte in gleicher Anzahl verteilt? z.B. Wenn ich 100 Zeilen in einer Tabelle und eine Spalte mit dem Namen NumberOfItems habe und ich ihnen die Werte 1-10 zuweisen möchte, so dass sie gleichmäßig auf die 100 Datensätze aufgeteilt werden (10 Datensätze haben 1, 10 wird 2 .... ..)Wie funktioniert der rand() Operator?

die Aussage, die ich habe, ist:

select CAST(RAND(CHECKSUM(NEWID())) * 10 as INT)+1 
+0

Es gibt keinen Ersatz dafür, etwas auszuprobieren. Haben Sie versucht, eine ausreichend große Stichprobe zu erstellen und die Verteilung darin zu bewerten? Ich bemerke auch, dass die Barebones Dokumentation Seite auf 'rand()' erwähnt, dass es nur Pseudozufall ist, aber nicht die wahrscheinliche Form der Verteilung. Wie bereits erwähnt, geht man davon aus, dass man für einen Datensatz mit unendlicher Größe in hypothetischen, durchschnittlichen Termen spricht, anstatt zu erwarten, dass man eine gleichmäßige Verteilung über eine endliche Menge erhält. Das wäre nicht zufällig, oder? –

+0

ohk das macht Sinn. Prost. Ich war mir nicht sicher, deshalb fragte ich. – Faiz

+0

Ich bemerke auch, dass die offizielle Seite von barbones über 'rand()', obwohl sie keine spezifische Distribution erwähnt, vorsichtig ist zu erwähnen, dass diese Funktion nur pseudozufällig ist. –

Antwort

2

Nein - die Wahrscheinlichkeit Verteilung einheitlich sein sollte, so dass Sie die gleiche Chance haben 0,2 auf 0,5 zu bekommen, aber es gibt keine Garantie dass Ein bestimmter Satz von "zufälligen" Zahlen wird einheitlich sein.

+0

ok, gibt es noch einen, der das erlaubt? – Faiz

+0

Nein, nicht in einem einzigen Operator. Eine Option wäre, die Datensätze "zu mischen", die Werte in der Reihenfolge zuzuordnen (10 1, 10 2 usw.) und sie dann in der ursprünglichen Reihenfolge zurückzusetzen. –

+0

Ich habe ein paar andere vage Ideen. Brauchen Sie speziell Zufälligkeit? Wenn nicht, und wenn die Zeilen eine sequentielle ID-Nummer haben, könnten Sie den Wert von 1 bis 10 mit einfacher Arithmetik erzeugen. Wenn Zufälligkeit erforderlich ist, gehe ich folgendermaßen vor: Erstellen Sie ein Array der nicht zufälligen Werte, die Sie verteilen möchten. Weisen Sie Ihren ersten Wert einer (Pseudo-) zufällig indizierten Zeile zu, die aus denen ausgewählt wird, für die der Wert noch nicht ausgefüllt wurde (oder ein anderer Flag gesetzt ist). Wiederholen Sie diesen Vorgang, bis alle Werte den Zeilen zugewiesen wurden.Ds Methode ist wahrscheinlich einfacher, aber das ist nur mein Gedankenprozess ;-) –

-1

Ich habe keinen SQL Server hier zu testen, aber das wird wahrscheinlich für Sie arbeiten.

SELECT 
     ((ROW_NUMBER() OVER(ORDER BY T1.rand_col)) % 10) + 1 as value_col, 
     T1.col1, 
     T1.col2, 
     T1.col3 

FROM (
     SELECT col1, 
       col2, 
       col3, 
       RAND(CHECKSUM(NEWID())) as rand_col 
     FROM your_table 
    ) T1 

ORDER BY T1.rand_col 

Was sie tut, ist:

  • Die subselect T1 ursprüngliche Tabelle ist (was ich your_table genannt), mit einer zusätzlichen Zufalls Spalte rand_col
  • Sortieren Werte durch diese zufällige Spalte in ORDER BY T1.rand_col
  • Geben Sie Reihen laufende Nummern (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...) indem Sie ROW_NUMBER() OVER(ORDER BY T1.rand_col)
  • -Grenze, die von % 10
  • Sum 1 tun zu 0-9 Zahlenbereich sequentiell den Bereich von 0-9 bis 1-10 `(...) + 1

Einige Referenzen

zu ändern
+0

Dies wird nicht funktionieren. 'Rand()' gibt den gleichen Wert für alle Zeilen zurück. –

+0

Es gab mir nah an dem, was ich wollte, aber ich ging einfach mit den Zahlen nacheinander geben. Prost, Jungs – Faiz

+0

Aktualisiert die Antwort nach Martin Smith Kommentar –

Verwandte Themen