Maaf untuk judul yang membingungkan, saya tidak yakin harus menulis apa di sana.
Saya punya tabel beberapa ratus catatan. Saya perlu menetapkan setiap rekaman tabel ini ke tabel dinamis pengguna yang jauh lebih kecil, dan pengguna harus mengganti dengan catatan apa yang mereka dapatkan.
Misalnya, jika TableA adalah
Row_Number () Id 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
dan TableB adalah
Row_Number () Id 1 1 2 2 3 3
Saya perlu hasil akhir yang ditetapkan
UserId RecordId 1 1 2 2 3 3 1 4 2 5 3 6 1 7 2 8 3 9 1 10
Saya telah berhasil melakukan sesuatu yang sedikit berantakan menggunakan operator mod, tetapi saya ingin tahu apakah permintaan yang sama ini dapat dijalankan tanpa tabel temp dan variabel.
Tabel temp digunakan karena TableA sebenarnya adalah Fungsi yang Ditentukan Pengguna yang mengubah string yang dibatasi koma menjadi sebuah tabel, dan saya memerlukan Hitungan objek dari 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
Adalah penting bahwa UserIds berganti juga. Saya tidak bisa menetapkan 1/3 atas catatan untuk User1, 1/3 kedua catatan untuk User2, dan 1/3 ketiga catatan untuk User3.
Juga, UserIds perlu mempertahankan urutan di mana mereka awalnya dimasukkan, itulah sebabnya saya punya Row_Number() OVER (ORDER BY (SELECT 1))
di tabel Pengguna
Apakah ada cara untuk menggabungkan tabel ini dalam satu permintaan jadi saya tidak perlu menggunakan tabel temp dan variabel?
Saya menggunakan SQL Server 2005
Count(*)
denganOVER()
untuk mendapatkan jumlah record tanpa benar-benar pengelompokan catatan. Hal ini memungkinkan saya untuk menyingkirkan tabel temp dan variabel, terima kasih :)