关于T-SQL的RANK,ROW_NUMBER

时间:2017-10-31 09:04:02

标签: sql sql-server rank row-number dense-rank

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

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

我需要一个不改变顺序的分区将返回:

  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

2 个答案:

答案 0 :(得分:3)

在子查询中使用min() over()来建立dense_rank()所需的排序值。

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

答案 1 :(得分:2)

你可以使用这个

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