rownumber() over(partition by col1 order by col2)

今天在使用多字段去重时,由于某些字段有多种可能性,只需根据部分字段进行去重,在网上看到了rownumber() over(partition by col1 order by col2)去重的方法,很不错,在此记录分享下:


  row_number() OVER ( PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的).
    与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.

  • row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).
  • rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).
  • dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的.
  • lag(arg1,arg2,arg3):
  1. arg1是从其他行返回的表达式
  2. arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,是一个往回检索以前的行的数目。
  3. arg3是在arg2表示的数目超出了分组的范围时返回的值。

函数语法:

OPAP函数语法四部分:

1.function 本身用于对窗口中的数据进行操作;

2.partitioning clause 用于将结果集分区;

3.order by clause 用于对分区中的数据进行排序;

4.windowing clause 用于定义function在其上操作的行的集合,即function所影响的范围;

----1. ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY COL2)

---查询所有姓名,如果同名,则按年龄降序

SELECT NAME ,AGE,DETAILS,ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY AGE DESC) FROM TEST_Y;

----通过上面的语句可知,ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY COL2)中是按照NAME字段分组,按AGE字段排序的。

----如果只需查询出不重复的姓名即可,则可使用如下的语句

SELECT * FROM (SELECT NAME,AGE,DETAILS ,ROW_NUMBER() OVER( PARTITION BY NAME ORDER BY AGE DESC)RN FROM TEST_Y )WHERE RN= 1;

----由查询结果可知,姓名相同年龄小的数据被过滤掉了;可以使用ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY COL2)对部分子弹进行去重处理

猜你喜欢

转载自blog.csdn.net/qq_33223299/article/details/81667203
col
今日推荐