Desculpe pelo título confuso, eu não sabia o que escrever lá.
Eu tenho uma tabela de algumas centenas de registros. Eu preciso atribuir cada registro desta tabela a uma tabela dinâmica muito menor de usuários, e os usuários devem alternar quanto aos registros que recebem.
Por exemplo, se a Tabela A for
Row_Number () Id 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
e a Tabela B é
Row_Number () Id 1 1 2 2 3 3
Eu preciso de um conjunto de resultados finais que seja
UserId RecordId 1 1 2 2 3 3 1 4 2 5 3 6 1 7 2 8 3 9 1 10
Consegui fazer algo um pouco confuso usando o operador mod, mas estava curioso para saber se essa mesma consulta poderia ser executada sem a tabela temporária e a variável.
A tabela temporária é usada porque TableA é, na verdade, uma função definida pelo usuário que converte uma string delimitada por vírgulas em uma tabela e preciso da contagem dos objetos da 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
É importante que os UserIds se alternem também. Não consigo atribuir o 1/3 superior dos registros ao User1, o segundo 1/3 dos registros ao User2 e o terceiro 1/3 dos registros ao User3.
Além disso, os UserIds precisam manter a ordem em que foram inseridos originalmente, por isso tenho um Row_Number() OVER (ORDER BY (SELECT 1))
na tabela do usuário
Existe uma maneira de unir essas tabelas em uma única consulta para que não precise usar uma tabela e variável temporária?
Estou usando o SQL Server 2005
Outra maneira de evitar tabelas temporárias seria esta:
Sim, você pode fazer isso sem tabelas temporárias:
Veja aqui uma demonstração do SQLFiddle