使用SQL Server中的Dense_Rank对具有排名的列进行排名

时间:2013-02-12 07:32:16

标签: sql-server dense-rank

我有一个要求,我将数据作为

StageID         Department Number       UserEmail

732                60012                user1@testing.com
733                60012                user1@testing.com
734                60012                user1@testing.com
735                60012                user2@testing.com
736                60012                user2@testing.com
737                60013                user3@testing.com   
738                60013                user3@testing.com

我想得到像这样的输出

StageID         Department Number       UserEmail       DRank

732              60012              user1@testing.com   1
733              60012              user1@testing.com   1
734              60012              user1@testing.com   1
735              60012              user2@testing.com   2
736              60012              user2@testing.com   2
737              60013              user3@testing.com   1
738              60013              user3@testing.com   1

我希望在对记录进行排名时考虑 DepartmentNumber UserEmail 的组合。我在分区上使用 DENSE_RANK()来实现这一点,但不知怎的,我无法得到我想要的输出。我不确定我哪里出错了。有人可以帮助我吗

这是我使用的查询

SELECT StageID, DepartmentNumber, UserEmail
        ,DENSE_RANK() OVER (PARTITION BY DepartmentNumber, UserEmail
         ORDER BY DepartmentNumber, UserEmail ASC) AS DRANK 
   FROM mytable 

2 个答案:

答案 0 :(得分:5)

我想你想要这个(JW提供的SQLFiddle):

SELECT StageID, DepartmentNumber, UserEmail
        ,DENSE_RANK() OVER (PARTITION BY DepartmentNumber
         ORDER BY UserEmail ASC) AS DRANK 
   FROM mytable 

Protip - 您永远不会在PARTITION BYORDER BY子句中使用相同的列。

如果我了解您的要求,那就是这样。我认为您希望每个部门行独立排名,并选择列作为电子邮件。如果这不是您的要求,则需要比

更明确
  

我希望在对记录进行排名时考虑DepartmentNumberUserEmail的组合。

答案 1 :(得分:-1)

您可以使用此技术在任意数量的列上构建密集排名: 创建所需列的concat结果,并在结果列上创建密集排名。在您的情况下,它将如下所示:

SELECT StageID,DepartmentNumber,UserEmail,          CONCAT(DepartmentNumber,' - ',UserEmail)为'DepAndEmail',         DENSE_RANK()OVER(由DepAndEmail订购)AS DRANK    来自mytable