2016-09-08 59 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

你想通过OrderLine订购DENSE_RANK分区,但在一个以上的记录有相同的GroupID案件,你希望排名相同。一种选择是使用子查询来为具有相同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

使用MIN(OrderLine)非常巧妙的解决方案,我的联接(使用多个值)正在以指数形式增长数据集,并且我没有追求这条途径。 谢谢! –