Извините за запутанный заголовок, я не был уверен, что там написать.
У меня есть таблица из нескольких сотен записей. Мне нужно назначить каждую запись этой таблицы гораздо меньшей динамической таблице пользователей, и пользователи должны чередовать, какие записи им назначаются.
Например, если TableA
Идентификатор Row_Number () 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
и таблица B
Идентификатор Row_Number () 1 1 2 2 3 3
Мне нужен набор конечных результатов, который
UserId RecordId 1 1 2 2 3 3 1 4 2 5 3 6 1 7 2 8 3 9 1 10
Мне удалось сделать что-то немного беспорядочно, используя оператор mod, но мне было любопытно, можно ли выполнить этот же запрос без временной таблицы и переменной.
Временная таблица используется потому, что TableA на самом деле является определяемой пользователем функцией, которая преобразует строку с разделителями-запятыми в таблицу, и мне нужно количество объектов из UDF.
-- Converts a comma-delimited string into a table
SELECT Num as [UserId], Row_Number() OVER (ORDER BY (SELECT 1)) as [RowNo]
INTO #tmpTest
FROM dbo.StringToNumSet('2,3,1', ',')
DECLARE @test int
SELECT @test = Count(*) FROM #tmpTest
SELECT *
FROM #tmpTest as T1
INNER JOIN (
SELECT Top 10 Id, Row_Number() OVER (ORDER BY SomeDateTime) as [RowNo]
FROM TableA WITH (NOLOCK)
) as T2 ON T1.RowNo = (T2.RowNo % @test) + 1
Важно, чтобы идентификаторы пользователей тоже чередовались. Я не могу назначить верхнюю 1/3 записей для User1, вторую 1/3 записей для User2 и третью 1/3 записей для User3.
Кроме того, UserIds должны поддерживать порядок, в котором они были первоначально введены, поэтому у меня есть Row_Number() OVER (ORDER BY (SELECT 1))
в таблице пользователя
Есть ли способ объединения этих таблиц в одном запросе, поэтому мне не нужно использовать временную таблицу и переменную?
Я использую SQL Server 2005
Count(*)
с ,OVER()
чтобы получить количество записей без фактических группировок записей. Это позволяет мне избавиться как от временной таблицы, так и от переменной, спасибо :)