2017-03-22 10 views
0

クライアントのテストデータをCustomer -< Bookingの形式で生成しています。達成しようとしているのは、1カスタマーあたりの予約数を1から25までランダムに生成することです。親行ごとの行のランダムなカーディナリティ

テーブルのテストデータを既に生成しているので、n <= ABS(CHECKSUM(NEWID())) % 25を数値表の結合条件として使用して、行ごとにランダムな基数を生成できると考えましたが、15分以上かかるため、戻る。理想的には、できるだけこれを2分未満に減らしたいと思います。次のように

私の石畳の試みは、次のとおりです。

;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; 

、誰もがそれが存在する場合、私は、このクエリあるいは全く異なるアプローチを再構築する方法を提案することができますか?

答えて

1

各行に乱数が必要な場合は、これはどうですか?

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

-1は、少なくとも1つの行が確実に選択されるようにすることです。

これは、各行の値をBCに再計算することに注意してください。これは実際にあなたの目的のために良いかもしれない:答えのための

SELECT B.CustomerId, n.n AS BookingIndex 
FROM (SELECT C.*, rand(CHECKSUM(NEWID())) * 25 + 1 as numrows 
     FROM dbo.Customer C 
    ) C INNER JOIN 
    #numbrers n 
    ON n.n <= numrows; 
+0

おかげで、しかし、私はあなたが私はCTEまたは#numbersテーブルをドロップする必要があります示唆しているかどうかについて混乱しています。 –

+0

@ChrisPickford。 。 。私は自分自身を混乱させた。アイデアは、数値表ではなくCTEを取り除くことです。 –

関連する問題