2016-08-24 2 views
1

テーブルから無作為に各グループのレコードを取得する必要があります。私はrownum()を使って(パーティションを.....)使ってみましたが、グループごとに引き出すことはできません。グループごとに1つ以上のレコードが必要なため、IDで区別できません。 は、次の表を考えてみます。SQLサーバーでランダムに各グループの 'n'レコードをプル

ST ID 
MA 1 
CA 2 
IL 3 
ME 4 
MA 5 
MA 6 
MA 7 
IL 8 
ME 9 
CA 10 
CA 11 
CA 12 
ME 13 
ME 14 
IL 15 
IL 16 
IL 17 

私のO/Pは次のよ​​うになります。 n = 2の場合

MA 1 
CA 2 
IL 3 
ME 4 
MA 5 
CA 10 
IL 16 
ME 13 
+0

可能な複製(http://stackoverflow.com/questions/848872/select-n-random-rows-from-sql -server-table) –

+0

トップ10%は必要ありません。グループごとにランダムなレコードが必要です。 –

答えて

2

あなたはNewId()Row_Number()を注文し、トップのみを引っ張ってこれを行うことができます

Declare @N Int = 2 

;With Cte As 
(
    Select ST, ID, Row_Number() Over (Partition By ST Order By NewId()) RN 
    From YourTable 
) 
Select ST, ID 
From Cte 
Where RN <= @N 
Order By ID 

注文NewId()によってランダムにTを代入します:グループあたりN彼はRow_Number()の値を各グループに割り当てます。したがって、RNの値が<=のものをNの値にするだけです。

0

これは機能するはずです。複数の番号が必要な場合は、UNION ALLを使用してデータを結合します。各UNIONがあなたに乱数を与える

create table ##Rand1 (ST Varchar(10),ID INT) 
-----========================= 
INSERT INTO ##Rand1 
Values 
('MA',1),('CA',2),('IL',3),('ME',4),('MA',5),('MA',6),('MA',7),('IL',8),('ME',9),('CA',10), 
('CA',11),('CA',12),('ME',13),('ME',14),('IL',15),('IL',16),('IL',17) 

------========================= 
DECLARE @Random INT 
DECLARE @Upper INT 
DECLARE @Lower INT 
SET @Lower = (select min(ID) FROM ##Rand1) ---- The lowest random number 
SET @Upper = (select MAX(ID) FROM ##Rand1)---- One more than the highest random number 
SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0) 
SELECT @Random AS ID 
[SQL Serverテーブルからn個のランダムな行を選択]の
関連する問題