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_NUMBER
、RANK
、DENSE_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的主要内容,如果未能解决你的问题,请参考以下文章