2

ストアド プロシージャに 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))
4

1 に答える 1