我在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_NUMBER
,RANK
,DENSE_RANK
,但对我没有任何作用。
答案 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