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