T-SQL 上的 RANK、ROW_NUMBER

Posted

技术标签:

【中文标题】T-SQL 上的 RANK、ROW_NUMBER【英文标题】:RANK, ROW_NUMBER on T-SQL 【发布时间】:2018-04-12 09:25:19 【问题描述】:

我在 SQL Server 2014 中有这样的行:

id | fld1
---+-----
1  | 100
2  | 100
3  | 80
4  | 102
5  | 100
6  | 80
7  | 102

我需要一个 partition 在不改变顺序的情况下会返回:

  NewFld | id | fld1
  -------+----+------
   1     | 1  | 100
   1     | 2  | 100
   2     | 3  | 80
   3     | 4  | 102
   1     | 5  | 100
   2     | 6  | 80
   3     | 7  | 102

Newfld 应该根据fld1 返回相同的值,而不改变id 给出的顺序。

我尝试使用 ROW_NUMBERRANKDENSE_RANK,但没有任何效果。

查看this fiddle

【问题讨论】:

那么,对于任何特定的fld1 值,如果您获得该值的MIN(id) 值,并为这些不同的值分配行号,您会得到您需要的结果吗?跨度> 您的问题现在解决了吗?您对这些答案还有疑问吗?要接受答案“Click the Tick”了解更多信息,请参阅help/accepting 【参考方案1】:

你可以用这个

with mytab as 
(
SELECT * 
  ,(SELECT MIN(ID) FROM yourtable sub where sub.fld1 = yourtable.fld1) as ranks
FROM yourtable

 )

 SELECT ID ,fld1 , DENSE_RANK()OVER(ORDER BY Ranks)
 FROM mytab
 ORDER BY ID

查看this fiddle

【讨论】:

【参考方案2】:

在子查询中使用min() over() 来确定@​​987654323@ 所需的排序值。

SELECT id
     , Fld1
     , DENSE_RANK() OVER (order by fld1_idmin) AS Rank
FROM (
       SELECT id
             , fld1
                 , Min (id) over (partition by fld1) fld1_idmin
           FROM yourtable
           ) d
    ORDER BY ID

使用这些窗口函数在 FLD1 上建立索引只需要对该查询进行一次索引扫描。看到这个SQLfiddle

【讨论】:

以上是关于T-SQL 上的 RANK、ROW_NUMBER的主要内容,如果未能解决你的问题,请参考以下文章

开窗函数_3

开窗函数_3

T-SQL开窗函数

T-SQL:qualify和window 使用(十七)

在 C# LINQ 中实现 RANK OVER SQL 子句

T-SQL 重新排列 1...n 中的值