我正在存储过程中编写一些 SQL,以将数据集减少到我想要报告的有限随机行数。
Group
报告以of开头,Users
并应用过滤器来指定所需的随机行总数 ( @SampleLimit
)。
为了达到预期的结果,我首先创建一个 CTE(临时表):
top(@SampleLimit)
应用的group by UserId
(因为用户 ID 出现多次)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))