首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dense_Rank排序

Dense_Rank排序
EN

Stack Overflow用户
提问于 2016-09-08 12:23:13
回答 1查看 327关注 0票数 1

我已经阅读了这个问题的一些变体,但解决方案似乎不起作用。

我希望为每个"OrderNo“和"GroupID”动态创建一个“子组”。子组应按"OrderLine“排序,例如:(预期结果)

代码语言:javascript
复制
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()创建了下面正确的组,但是排序(和排名)是完全错误的。

代码语言:javascript
复制
SELECT 
    OrderNo, OrderLine, GroupID,
    DENSE_RANK() OVER (PARTITION BY OrderNo ORDER BY GroupID) AS Subgroup
FROM 
    #temptable
ORDER BY
    OrderNo, OrderLine;

输出:

代码语言:javascript
复制
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

查询:

代码语言:javascript
复制
-- 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');
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-08 12:26:52

您希望按OrderLineDENSE_RANK分区进行排序,但在多个记录具有相同GroupID的情况下,您希望等级相同。一种选择是使用子查询来标识,为具有相同GroupID的一组记录的OrderLine赋值(即最小值)。然后,可以将该表连接回您的#temptable,并且可以根据需要将有效的OrderLine用于DENSE_RANK

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39382566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档