2017-03-22 3 views
0

Ich erstelle einige Testdaten für einen Client in Form von Customer -< Booking und was ich versuche zu erreichen, ist eine zufällige Anzahl von Buchungen pro Kunde (zwischen 1 und 25) zu generieren.Zufällige Kardinalität der Zeilen pro Elternzeile

Nachdem sie bereits generierten Testdaten für den Customer Tisch, ich dachte, ich n <= ABS(CHECKSUM(NEWID())) % 25 als Join-Bedingung zu einer Zahlen-Tabelle verwenden könnte den Zufall Mächtigkeit pro Zeile zu erzeugen, jedoch muss mein Versuch sehr suboptimal, weil es mehr als 15 Minuten dauert ist zu Rückkehr. Im Idealfall möchte ich diese wenn möglich auf unter 2 Minuten reduzieren.

Mein gepflasterte Versuch ist wie folgt:

;WITH CTE_BookingCounts AS (
    SELECT 
    CustomerId, 
    ABS(CHECKSUM(NEWID())) % 25 AS R 
    FROM dbo.Customer 
) 
SELECT 
    B.CustomerId, 
    N.n AS BookingIndex 
FROM dbo.Customer C 
INNER JOIN CTE_BookingCounts BC ON BC.CustomerId = C.CustomerId 
INNER JOIN #numbers N ON N.n <= BC.R; 

Bitte könnte jemand empfehlen, wie ich diese Abfrage restrukturieren oder sogar einen ganz anderen Ansatz, wenn es vorhanden ist?

Antwort

1

Wenn Sie nur eine Zufallszahl für jede Zeile benötigen, wie wäre es damit?

SELECT B.CustomerId, n.n AS BookingIndex 
FROM dbo.Customer C INNER JOIN 
    #numbers n 
    ON rand(CHECKSUM(NEWID())) * 25 - 1 <= n.n; 

Die -1 ist, um sicherzustellen, dass mindestens eine Zeile ausgewählt ist.

Ich sollte beachten, dass dies die Werte für jede Zeile in BC neu berechnet. Dies könnte tatsächlich besser für Ihre Zwecke sein:

+0

Danke für die Antwort, aber ich bin verwirrt, ob Sie vorschlagen, ich sollte die CTE oder die #numbers Tabelle fallen lassen. –

+0

@ChrisPickford. . . Ich war selbst verwirrt. Die Idee ist, den CTE loszuwerden, nicht die Nummerntabelle. –

Verwandte Themen