タイトルが紛らわしいので申し訳ありませんが、そこに何を書けばよいかわかりませんでした。
数百レコードのテーブルがあります。このテーブルの各レコードをユーザーのはるかに小さい動的テーブルに割り当てる必要があります。ユーザーは、割り当てられるレコードを交互に切り替える必要があります。
たとえば、TableAが
Row_Number()ID 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
そしてTableBは
Row_Number()ID 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
UserIdも代替することが重要です。レコードの上位1/3をUser1に、2番目のレコードをUser2に、3番目の1/3をUser3に割り当てることができません。
また、UserIdは最初に入力された順序を維持する必要があるためRow_Number() OVER (ORDER BY (SELECT 1))
、ユーザーのテーブルに
これらのテーブルを1つのクエリで結合する方法はありますか?そのため、一時テーブルと変数を使用する必要はありませんか?
SQL Server 2005を使用しています
Count(*)
とOVER()
、実際にレコードをグループ化することなく、レコード数を取得します。これにより、一時テーブルと変数の両方