2

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
4

1 に答える 1

6

あなたが使用することができますCOUNT(GroupID)OVER(PARTITION BY GroupID)

WITH CTE AS
(
  SELECT GroupId, Item
  , GroupCount = COUNT(GroupID) OVER (PARTITION BY GroupID)
  , Pos = ROW_NUMBER() OVER (Partition By GroupID Order By GroupId)
  FROM #Data
)
SELECT GroupID, Item, Pos, GroupCount 
FROM CTE

OVER句(Transact-SQL)

これがフィドルです:http ://sqlfiddle.com/#!6 / b6505 / 2/0

注文方法がわからないため、注文されていないことに注意してください。

于 2012-10-10T22:37:08.547 に答える