这TOP(1) ORDER BY NEWID()
不会像你试图让它在这里工作的方式工作。这TOP
是告诉查询引擎您只对结果集的第一条记录感兴趣。您需要NEWID()
对每条记录进行评估。您可以在窗口函数中强制执行此操作,例如 ROW_NUMBER()。我可以想象这可以优化,但是,这是我能想到的。请注意,这几乎不是一个真正的随机算法。
更新了以前的案例排除
DECLARE @User TABLE(UserId INT)
DECLARE @Case TABLE(CaseID INT)
DECLARE @UserCase TABLE (UserID INT, CaseID INT, DateAssigned DATETIME)
DECLARE @CaseCount INT =10
DECLARE @SaveCaseID INT = @CaseCount
DECLARE @UserCount INT = 100
DECLARE @NumberOfUserAllocatedAtStart INT= 85
WHILE(@CaseCount > 0)BEGIN
INSERT @Case VALUES(@CaseCount)
SET @CaseCount = @CaseCount-1
END
DECLARE @RandomCaseID INT
WHILE(@UserCount > 0)BEGIN
INSERT @User VALUES(@UserCount)
SET @UserCount = @UserCount-1
IF(@NumberOfUserAllocatedAtStart > 0 )BEGIN
SET @RandomCaseID = (ABS(CHECKSUM(NewId())) % (@SaveCaseID))+1
INSERT @UserCase SELECT @UserCount,@RandomCaseID,DATEADD(MONTH,-3,GETDATE())
SET @RandomCaseID = (ABS(CHECKSUM(NewId())) % (@SaveCaseID))+1
INSERT @UserCase SELECT @UserCount,@RandomCaseID,DATEADD(MONTH,-5,GETDATE())
SET @RandomCaseID = (ABS(CHECKSUM(NewId())) % (@SaveCaseID))+1
INSERT @UserCase SELECT @UserCount,@RandomCaseID,DATEADD(MONTH,-2,GETDATE())
SET @NumberOfUserAllocatedAtStart=@NumberOfUserAllocatedAtStart-1
END
END
;WITH RowNumberWithNewID AS
(
SELECT
U.UserID, C.CaseID, UserCase_CaseID = UC.CaseID,
RowNumber = ROW_NUMBER() OVER (PARTITION BY U.UserID ORDER BY NEWID())
FROM
@User U
INNER JOIN @Case C ON 1=1
LEFT OUTER JOIN @UserCase UC ON UC.UserID=U.UserID AND UC.CaseID=C.CaseID AND UC.DateAssigned > DATEADD(MONTH, -4, UC.DateAssigned)
WHERE
UC.CaseID IS NULL OR UC.CaseID <> C.CaseID
)
SELECT
UserID,
CaseID,
PreviousCases = STUFF((SELECT ', '+CONVERT(NVARCHAR(10), UC.CaseID) FROM @UserCase UC WHERE UC.UserID=RN.UserID FOR XML PATH('')),1,1,'')
FROM RowNumberWithNewID RN
WHERE
RN.RowNumber=1