table_a 表中有2个字段. col_num,col_art.字段值如下 col_num col_art
-----------------------
20091121 0
20091121 0
20091121 0
20091122 0
20091122 1
20091122 0
20091123 1
20091123 0
20091123 2 从上面的结果中很容易看出 20091121 的为一组.
判断col_art有重复的就让它加1. 最终结果 col_num col_art
-----------------------
20091121 0
20091121 1
20091121 2
20091122 0
20091122 1
20091122 2
20091123 1
20091123 0
20091123 2
解决 sql
select col_num , row_number() over (partition by col_num order by col_num)-1 from table_a 其中的 row_number() over (partition by col_num order by col_num)-1 没有理解麻烦高手们给解释下 谢谢!
-----------------------
20091121 0
20091121 0
20091121 0
20091122 0
20091122 1
20091122 0
20091123 1
20091123 0
20091123 2 从上面的结果中很容易看出 20091121 的为一组.
判断col_art有重复的就让它加1. 最终结果 col_num col_art
-----------------------
20091121 0
20091121 1
20091121 2
20091122 0
20091122 1
20091122 2
20091123 1
20091123 0
20091123 2
解决 sql
select col_num , row_number() over (partition by col_num order by col_num)-1 from table_a 其中的 row_number() over (partition by col_num order by col_num)-1 没有理解麻烦高手们给解释下 谢谢!
表示按col_num分组
再按col_num排序,然后编号
row_number() over (partition by col_num order by col_num)-1按col_num分区,按col_num排序,产生每行的一个偏移量(从1开始,所以-1才出现你要求的0)
row_number用来返回有序组中一行的偏移量。
偏移量 应该怎么解释?
partition by是分区,order by是排序,也就是说按照col_num来分组,每个组内部按照col_num来排序,从而产生一个序号(这个序号在组内部是从1开始,依次递增;在不同的组之间都是从1重新开始计数。)
因为从1开始,所以-1才出现你要求的0.
rank, dense_rank,row_number 分析函数 Rank,Dense_rank,Row_number函数为每条记录产生一个从1开始至N的自然数,N的值可能小于等于记录的总数。这3个函数的唯一区别在于当碰到相同数据时的排名策略。 因为楼主是从0开始的,所以减1.① ROW_NUMBER:
Row_number函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。 ② DENSE_RANK:
Dense_rank函数返回一个唯一的值,除非当碰到相同数据时,此时所有相同数据的排名都是一样的。 ③ RANK:
Rank函数返回一个唯一的值,除非遇到相同的数据时,此时所有相同数据的排名是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。 示例:
/* Formatted on 2009/11/08 20:48 (Formatter Plus v4.8.8) */
SELECT ename, deptno, sal,
RANK () OVER (PARTITION BY deptno ORDER BY sal DESC) "RANK",
DENSE_RANK () OVER (PARTITION BY deptno ORDER BY sal DESC) "DENSE_RANK",
ROW_NUMBER () OVER (PARTITION BY deptno ORDER BY sal DESC) "ROW_NUMBER"
FROM scott.emp 本文来自CSDN博客,转载请标明出处http://blog.csdn.net/tianlesoftware/archive/2009/11/10/4795632.aspx
为有序组中的每一行,返回一个唯一的排序值,序号由order by 子句指定列值大小决定 从1开始
row_number() over (partition by 列名1 order by 列名2)
对查询的查询结果先按 列名1 值来进先分组 ,对于同一个组的有序行按 列名2 再来分一个组内一个排名说简单一点:这个有点类似以前高中的高分排名,前一种就是全校一个年级所班级所有学员放在一起按总分来排名次,而后一种是以班级来单位排班级内部的名次。