1

考虑以下示例数据:

Name    Email  RowRank   PartitionRank
----    -----  -------   -------------
a1      e1      1         1
a1      e1      2         1
a2      e2      1         2
a2      e2      2         2
a2      e2      3         2

我正在尝试编写一个查询,该查询按名称 + 电子邮件对数据进行分区,然后为我提供每个分区中一行的索引和分区本身的数量(最后 2 列列出了预期的输出)。

我一直在尝试各种查询,使用 ROW_NUMBER 很容易生成 RowRank,但是我无法使用 4 个排名函数(NTILE、RANK、DENSE_RANK 或 ROW_RANK)中的任何一个来生成分区排名。我相信这应该是可能的,但我自己无法做到。

这是一个示例查询:

SELECT Name, Email,
        ROW_NUMBER() OVER (PARTITION BY Name, Email ORDER BY Email, DisplayName) AS RowRank,
        NTILE(1) OVER (PARTITION BY Name, Email ORDER BY Email, DisplayName) AS PartitionRank
FROM Zone.MyTable

有人可以帮我获得正确的分区等级。

4

3 回答 3

3

您需要在整个输出上使用 DENSE_RANK() (无分区)

SELECT Name, Email,
        ROW_NUMBER() OVER (PARTITION BY Name, Email ORDER BY Email, DisplayName) AS RowRank,
        DENSE_RANK() OVER (ORDER BY Name, Email) AS PartitionRank
FROM Zone.MyTable
于 2014-01-10T22:52:47.483 回答
2

这对我有用:

select *
  , RowRank = row_number() over (partition by Name order by Email)
  , PartitionRank = dense_rank() over (order by Name)
from MyTable

SQL Fiddle 与演示

于 2014-01-10T22:52:39.223 回答
0
select * ,row_number() over (order by Salary desc) as [Row_number],rank() over (order by Salary desc) as [Rank],dense_rank() over (order by Salary desc) as [Dense_rank],ntile(3) over (order by Salary desc) as [Ntile] from Employee 

检查下面给出的 URL 中的示例

http://www.freshcodehub.com/Article/50/implement-ranking-functions-in-sql-server

于 2018-05-22T14:01:24.747 回答