SQL 获取顺序号的四种方法_IDENTITY/RANK/DENSE_RANK/ROW_NUMBER
1.最早知道的是用 IDENTITY(int, 1, 1) 塞到临时表中,再与原表中数据相
SELECT CASENO,SEQNUM , IDENTITY(int, 1, 1) AS [ID] into #tmptest FROM table where PO='888'
order by CASENO,CAST(SEQNUM AS INT)
虽然这种方式有点麻烦...
2.后来知道了Dense_rank() over (order by colname)
---才发现原来可以不用塞临时表
3.再后来才知有个更历害的Row_number() over (partition by colname1 order by colname2)
---发觉原来partition不止它有,它们也可以有:
上网查询发现了 后三种排序的区别:
原文:http://blog.csdn.net/winer2008/article/details/4283539
rank,dense_rank,row_number使用和区别
rank,dense_rank,row_number区别
一:语法(用法):
rank() over([partition by col1] order by col2)
dense_rank() over([partition by col1] order by col2)
row_number() over([partition by col1] order by col2)
其中[partition by col1]可省略。
二:区别
三个分析函数都是按照col1分组内从1开始排序
row_number() 是没有重复值的排序(即使两天记录相等也是不重复的),可以利用它来实现分页
dense_rank() 是连续排序,两个第二名仍然跟着第三名
rank() 是跳跃拍学,两个第二名下来就是第四名
为怕再区分不清,摘抄如下:
1.rank
SQL> select name,score,rank() over(partition by name order by score) tt from t;
NAME SCORE TT
---------- ----- ----------
数学 67 1
数学 77 2
数学 78 3
数学 88 4
数学 99 5
语文 60 1
语文 70 2
语文 80 3 <----
语文 80 3 <----
语文 90 5
2.dense_rank
SQL> select name,score,dense_rank() over(partition by name order by score) tt from t;
NAME SCORE TT
---------- ----- ----------
数学 67 1
数学 77 2
数学 78 3
数学 88 4
数学 99 5
语文 60 1
语文 70 2
语文 80 3 <----
语文 80 3 <----
语文 90 4
3.row_number
SQL> select name,score,row_number() over(partition by name order by score) tt from t;
NAME SCORE TT
---------- ----- ----------
数学 67 1
数学 77 2
数学 78 3
数学 88 4
数学 99 5
语文 60 1
语文 70 2
语文 80 3 <----
语文 80 4 <----
语文 90 5