2016-09-08 5 views
1

私はこの質問のいくつかのバリエーションを読んだが、解決策は動作していないようだ。Dense_Rank ordering

"OrderNo" & "GroupID"ごとに "サブグループ"を動的に作成したいと考えています。サブグループは、「オーダーライン」などが発注する必要があります(期待される成果)

OrderNo OrderLine GroupID Subgroup 
------------------------------------ 
10463 1   798 1 
10463 2   799 2 
10463 3   797 3 
10463 5   65  4 
10463 6   65  4 
10463 7   65  4 
10481 4   917 1 
10481 5   918 2 
10481 6   131 3 
10481 7   131 3 
10481 8   131 3 
10481 9   130 4 

私は、以下の正しいグループを作成するために、DENSE_RANK()を使用しましたが、順序(ランク)は完全に間違っています。

SELECT 
    OrderNo, OrderLine, GroupID, 
    DENSE_RANK() OVER (PARTITION BY OrderNo ORDER BY GroupID) AS Subgroup 
FROM 
    #temptable 
ORDER BY 
    OrderNo, OrderLine; 

出力:

OrderNo OrderLine GroupID Subgroup 
------------------------------------ 
10463 1   798 3 
10463 2   799 4 
10463 3   797 2 
10463 5   65  1 
10463 6   65  1 
10463 7   65  1 
10481 4   917 3 
10481 5   918 4 
10481 6   131 2 
10481 7   131 2 
10481 8   131 2 
10481 9   130 1 

問合せ:

-- Temp tables 
CREATE TABLE #temptable 
( 
    OrderNo varchar(5), 
    OrderLine int, 
    GroupID int 
); 

INSERT INTO #temptable (OrderNo, OrderLine, GroupID) 
VALUES ('10463', '1', '798'), ('10463', '2', '799'), 
     ('10463', '3', '797'), ('10463', '5', '65'), 
     ('10463', '6', '65'), ('10463', '7', '65'), 
     ('10481', '4', '917'), ('10481', '5', '918'), 
     ('10481', '6', '131'), ('10481', '7', '131'), 
     ('10481', '8', '131'), ('10481', '9', '130'); 

答えて

1

あなたはOrderLineDENSE_RANKパーティションを注文したいのですが、場合によっては複数のレコードが同じGroupIDを有する場合には、ランクを同じにします。 1つのオプションは、サブクエリを使用して、同じGroupIDを持つレコードセットのOrderLine(最小値)の単一の値を割り当てることを識別することです。この表はあなたの#temptableに再結合することができ、有効なOrderLineDENSE_RANKに使用できます。

SELECT t1.OrderNo, 
     t1.OrderLine, 
     t1.GroupID, 
     DENSE_RANK() OVER (PARTITION BY t1.OrderNo ORDER BY t2.OrderLine) AS Subgroup 
FROM #temptable t1 
INNER JOIN 
(
    SELECT OrderNo, 
      MIN(OrderLine) AS OrderLine, 
      GroupID 
    FROM #temptable 
    GROUP BY OrderNo, 
      GroupID 
) t2 
    ON t1.OrderNo = t2.OrderNo AND 
     t1.GroupID = t2.GroupID 
+0

残念ながら、 'GroupID'は必ずしも順不同です。 _Subgroupsは "OrderLine" _によって注文されるべきですが、もちろんこれは結果を歪めています –

+0

私の結合(複数の値を使用して)は指数関数的にデータセットを増やしていましたが、私はこの道を追求しませんでした。 ありがとうございます! –

関連する問題