SQL Server 2008の一時テーブルに結果セットがあります。フィールドの1つはグループIDであり、グループごとに任意の数の行を含めることができます。「行1/3」など、グループ内の行の位置を新しい列に入れたいので、一時テーブル#Data(GroupId int、Item char)がある場合
GroupId Item
-------------
5 C
5 A
5 T
2 U
3 Y
3 L
入手したい
GroupId Item Pos GroupCount
----------------------------
5 C 1 3
5 A 2 3
5 T 3 3
2 U 1 1
3 Y 1 2
3 L 1 2
私はなんとかこれを行うことができました
SELECT D.GroupId, D.Item, ROW_NUMBER() OVER (PARTITION BY D.GroupId ORDER BY D.Item) AS Pos, COUNT(1) AS GroupCount
FROM #Data D
INNER JOIN #Data DC
GROUP BY D.GroupId, D.Item
しかし、これにはあまり満足していません。これは、実際に取得する必要のあるすべての列のためにクエリが実際には少し複雑であり、グループ行数を取得するためにそれ自体と内部結合を実行し、取得するためにパーティションを実行するためです。行の位置が多すぎるようです。これを行うためのより簡単な方法はありますか?
私はティムの答えを正確に使用しませんでしたが、それは私に道を示しました:
SELECT D.GroupId, D.Item,
ROW_NUMBER() OVER (PARTITION BY D.GroupId ORDER BY D.Item) AS Pos,
COUNT(D.GroupId) OVER (PARTITION BY D.GroupId) AS GroupCount
FROM #Data D