Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何按一列排序,但根据非数字的不同列排序?_Sql Server_Ranking Functions - Fatal编程技术网

Sql server 如何按一列排序,但根据非数字的不同列排序?

Sql server 如何按一列排序,但根据非数字的不同列排序?,sql-server,ranking-functions,Sql Server,Ranking Functions,我有四个列,我试图排名。他们需要按员工ID分组,然后按订单号从低到高列出。然后,当一切都井然有序时,我真的在努力获得城市的排名。如果同一个城市为同一名员工列出了一个又一个城市,那么我希望这些城市的排名相同 下表为一个示例。顺序是正确的,但是排名不是为了我想做的 Name Employee_ID Order_Number City Rank John 1 1 Bo

我有四个列,我试图排名。他们需要按员工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

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

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
检查上的脚本输出。

您可以使用
LAG()
检查上一个城市是否相同。如果前一个城市不同或为空,则我们按原样取秩,如果城市相同,则秩-1给出的数字与上面的行相同

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