1.db2 row_number() over() 中 partition by 用于给结果集分组
seletc row_number() over(partition by log_user_id) as tmpid, o.* from ope_match_his_log o
partition by 用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,如果有它会根据指定字段进行分组并把分组中的多条记录显示,而且会对每个log_user_id的tmpid 进行排序。它和聚合函数不同的地方在于它能够返回一个分组中的多条记录,而聚合函数一般只有一个反映统计值的记录。
输出结果:
tmpid ID log_user_id
1 5613 111122222
2 5611111122222
3 5616 111122222
1 5654 345678900
2 5681 345678900
2. row_number() OVER (PARTITION BY COL1 ORDER BY COL2)
seletc row_number() over(partition by log_user_id order by id desc) as tmpid, o.* from ope_match_his_log o
row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序。
输出结果:
tmpid ID log_user_id
1 5616 111122222
2 5613111122222
3 5611 111122222
1 5681 345678900
2 5654 345678900
3. row_number() over(order by col1) 再order by col1 输出结果
seletc row_number() over(order by id desc) as tmpid, o.* from ope_match_his_log o order by
执行结果
tmpid ID log_user_id
1 583206 13068
2 583205 21020
3 583204 21021
......
2604 580603 210201
2605 580602 210202
seletc row_number() over(order by id desc) as tmpid, o.* from ope_match_his_log o order by id asc
输出结果:
tmpid ID log_user_id
2605 580602 210202
2604 580603 210201
.......
3 583204 21021
2 583205 21020
1 583206 13068
经过两个输出结果:先进行over(order by id desc) 的排序,tmpid编号应经被分配,然后在进行order by id asc 排序后 timid 的编号也不会变了。
4.fetch first n row only 的诡异
在用db2 是发现个问题就是
select * from tablename order by column desc
select * from tablename order by column desc fetch first n row only
执行这两条sql的时候如果 order by column 中 column 存在重复的字段 fetch first n row only 会打乱
以前的排序,看一篇博客:网址:http://zhouchaofei2010.iteye.com/blog/2249684
说是“order by如果列有相同值就按物理顺序排的(即先插入的数据排在前面),但是 加了fetch first n rows only 后竟然改变了对查询结果的排序方式,在ordery by 字段值相同的时候,90% 以上的数据是按键值(这里是日期acdate)倒序排序的,永远取到日期acdate 最小的那几条条数据”
博主也不知道是不是bug,我也不知道是什么原因,所以有知道的可以告诉我谢谢!