ストアド プロシージャに SQL を記述して、データセットをレポート対象の限られたランダムな数の行に減らしています。
Group
レポートはof で始まり、Users
必要なランダム行の総数を指定するためにフィルタが適用されます ( @SampleLimit
)。
目的の結果を得るために、まず CTE (一時テーブル) を次のように作成します。
top(@SampleLimit)
適用されたgroup by UserId
(UserID が複数回表示されるため)order by NEWID()
結果をランダムに並べる
SQL:
; with cte_temp as
(select top(@SampleLimit) UserId from QueryResults
where (GroupId = @GroupId)
group by UserId order by NEWID())
この結果セットを取得したら、UserId がNOT IN
前の手順で作成した CTE である結果をすべて削除します。
delete QueryResults
where (GroupId = @GroupId) and (UserId not in(select UserId from cte_temp))
私が抱えている問題は、時々、指定されたよりも多くの結果が得られること@SampleLimit
と、期待どおりに機能することです。
SQL を分割してアプリケーションの外部で実行しようとしましたが、問題を再現できません。
私がやっていることに何か根本的に間違っていることはありますか?
完全を期すために-以下の回答に基づいてリファクタリングされたソリューション:
select top(@SampleLimit) UserId into #T1
from QueryResults
where (GroupId = @GroupId)
group by UserId
order by NEWID()
delete QueryResults
where (GroupId = @GroupId) and (UserId not in(select UserId from #T1))