【问题标题】:How to order by one column, but rank based on a different column that is not numeric?如何按一列排序,但根据不同的非数字列进行排名?
【发布时间】:2019-06-13 17:12:11
【问题描述】:

我要对四列进行排名。它们需要按员工 ID 分组,然后按订单号从低到高列出。然后当一切都井井有条时,我真的想得到城市在该顺序中的排名。如果同一名员工的同一个城市一个接一个地列出,那么我希望那些排名相同。

下表是一个示例。顺序是对的,但是排名不是我想做的。

Name            Employee_ID     Order_Number     City       Rank   
John               1                1            Boston       1  
John               1                2            Boston       2  
Will               2                1            Peabody      1  
Will               2                2            Weston       2   
Will               2                3            Newton       3



select Name, Employee_ID, Order_Number, City,
dense_rank() over(partition by Employee_ID order by Order_Number) as rank
from #Employee

我真正想要的结果是:

Name            Employee_ID     Order_Number     City       Rank   
John               1                1            Boston       1  
John               1                2            Boston       1  
Will               2                1            Boston       1  
Will               2                2            Weston       2   
Will               2                3            Newton       3  

然后我最终会删除重复的城市以结束:

Name            Employee_ID     Order_Number     City       Rank   
John               1                1            Boston       1  
Will               2                1            Boston       1  
Will               2                2            Weston       2   
Will               2                3            Newton       3

【问题讨论】:

    标签: sql-server ranking-functions


    【解决方案1】:

    您可以尝试以下脚本来获得所需的输出。

    SELECT Name, Employee_ID, Order_Number, City ,
    ROW_NUMBER() OVER (PARTITION BY Employee_ID ORDER BY Order_Number) rank
    (
        select Name, Employee_ID, Order_Number, City,
        dense_rank() over(partition by Employee_ID,city order by Order_Number) as rank
        from #Employee
    )A
    WHERE rank = 1
    

    结果集的输出是-

    Name    Employee_ID Order_Number    City    rank
    John    1           1               Boston  1
    Will    2           1               Peabody 1
    Will    2           2               Weston  2
    Will    2           3               Newton  3
    

    检查Fiddle上的脚本输出。

    【讨论】:

      【解决方案2】:

      您可以使用LAG() 来检查之前的城市是否相同。如果前一个城市不同或为空,那么我们就按原样进行排名,如果城市相同,那么排名 - 1 给我们与上面行相同的数字。 Demo

      with cte as (select Name, Employee_ID, Order_Number, City,
      dense_rank() over (partition by Employee_ID order by Order_Number) as rank,
      lag(City) over (partition by Employee_ID order by Order_Number) as previousCity
      from #Employee)
      select 
          Name, Employee_ID, Order_Number, City,
          case when previousCity = city then rank - 1
               else rank end as rank
      from cte
      

      【讨论】:

        猜你喜欢
        • 2022-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-23
        • 2021-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多