请教分析函数first_value与min,last_value与max

[复制链接]
查看11 | 回复9 | 2013-12-18 09:29:14 | 显示全部楼层 |阅读模式
请教分析函数first_value与min,last_value与max
select a.zhh,a.rq,a.zdl,
first_value(zdl)over(partition by a.rq order by zhh ) first_value,
min(zdl)over(partition by a.rq order by zhh ) min,
last_value(zdl)over(partition by a.rq order by zhh ) last_value,
max(zdl)over(partition by a.rq order by zhh ) max
from R_JLDDL a where zdl0
and to_char(rq,'yyyymmdd')='20100819'order by rq,zhh
) t order by rq
结果:
ZHH
RQ
ZDLFIRST_VALUEMINLAST_VALUEMAX
101501648422010/8/19 0.310.310.311983.21983.2
201501648422010/8/19 0.310.310.311983.21983.2
301501648422010/8/19 0.530.310.311983.21983.2
401501648422010/8/19 0.530.310.311983.21983.2
501501648422010/8/19 4.990.310.311983.21983.2
601501648422010/8/19 8.390.310.311983.21983.2
701501648422010/8/19 770.50 0.310.311983.21983.2
801501648422010/8/19 1983.20 0.310.311983.21983.2
904000091192010/8/19 0.040.310.041730.771983.2
1004000091192010/8/190.050.310.041730.771983.2
1104000091192010/8/19576.770.310.041730.771983.2
1204000091192010/8/19576.810.310.041730.771983.2
1304000091192010/8/19756.980.310.041730.771983.2
1404000091192010/8/19757.030.310.041730.771983.2
1504000091192010/8/191315.610.310.041730.771983.2
1604000091192010/8/191730.770.310.041730.771983.2
我并没有对字段zhh限制,为什么first_value与last_value都会在字段rq下,又按照字段zhh来查找最前一条和最后一条记录?
回复

使用道具 举报

千问 | 2013-12-18 09:29:14 | 显示全部楼层
原帖由 dreamjj001 于 2010-12-17 08:55 发表
.2
我并没有对字段zhh限制,为什么first_value与last_value都会在字段rq下,又按照字段zhh来查找最前一条和最后一条记录?

partition by rq :当然都会在rq下了
"又按照..."
没看明白你想问啥?
关于分析函数,此时的窗口默认是 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
回复

使用道具 举报

千问 | 2013-12-18 09:29:14 | 显示全部楼层
原帖由 atgc 于 2010-12-17 09:07 发表
partition by rq :当然都会在rq下了
"又按照..."
没看明白你想问啥?
关于分析函数,此时的窗口默认是 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.


first_value 还算OK的话,last_value按照他的理解就是穿越了。
Last_value返回值不是按照你说的 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
应该说LZ觉得,Last_value函数按此时的用法应该和ZDL字段的返回值一样才对。。
具体我也说不明白,但first_value这样的函数,只是想返回其中随便一个值的时候才用的,为了提升SQL效率。
回复

使用道具 举报

千问 | 2013-12-18 09:29:14 | 显示全部楼层
我再帮LZ enligt一下,这和ROWNUM的用法有关的。
比如你在这个表里
select zdl from R_JLDDL a
where rownum=1
--order by **
这里的ORDER BY 后面不关跟什么都是徒劳的,返回结果不变。
LZ可以先对原表进行ORDER BY以后 再嵌套的方式用 ROWNUM相关的函数
回复

使用道具 举报

千问 | 2013-12-18 09:29:14 | 显示全部楼层
如 atgc 所言, 注意默认的窗口.
回复

使用道具 举报

千问 | 2013-12-18 09:29:14 | 显示全部楼层
原帖由 影之哀伤 于 2010-12-17 09:35 发表
我再帮LZ enligt一下,这和ROWNUM的用法有关的。
比如你在这个表里
select zdl from R_JLDDL a
where rownum=1
--order by **
这里的ORDER BY 后面不关跟什么都是徒劳的,返回结果不变。
LZ可以先对原表进行ORDER BY以后 再嵌套的方式用 ROWNUM相关的函数

这个说的不对,你对rownum机制没有搞清楚
回复

使用道具 举报

千问 | 2013-12-18 09:29:14 | 显示全部楼层
注意分析函数的默认窗口
没有order by,没有window,可以相当于整体大组为一个窗口,每个大组内的行都在这个窗口上进行分析函数计算
有了order by,没有window,那么相当于按order by排序,每行对应于按照排序键值和partition划分的滑动窗口内,这里相当于range ...,
比如 idname
1 'a'
1'b'
按照order by id,那么这两行对应的窗口应该是一样的,他们的分析函数运行结果也一样,很容易理解,如果显示order by id rows...那么是不一样的
回复

使用道具 举报

千问 | 2013-12-18 09:29:14 | 显示全部楼层
原帖由 dingjun123 于 2010-12-17 09:51 发表
这个说的不对,你对rownum机制没有搞清楚

FISRT_VALUE这样的函数跟ROWNUM没关系么?
LZ企图用此SQL后面最后的ORDER BY 来控制 这两个函数的输出值,我觉得这不会起作用。
再次请教~
回复

使用道具 举报

千问 | 2013-12-18 09:29:14 | 显示全部楼层
你这个语句会靠不住的,由于你的排序字段ZHH的值都是一样的,oracle不能保证最小ZDL排在第一个
回复

使用道具 举报

千问 | 2013-12-18 09:29:14 | 显示全部楼层
原帖由 影之哀伤 于 2010-12-17 10:11 发表

FISRT_VALUE这样的函数跟ROWNUM没关系么?
LZ企图用此SQL后面最后的ORDER BY 来控制 这两个函数的输出值,我觉得这不会起作用。
再次请教~

first_value和rownum有什么关系啊,他们根本是不同的东西,first_value是分析函数,根据窗口来计算排序后的结果集的第1行,如果order by不确定,那么结果是不确定的。
rownum的机制文档有,排序走索引与不走索引,select * from ... where rownum... order by的原理是不一样的,所以你说order by后面跟什么结果一样,那是不对的,再说了就算order by不走索引,不同的排序结果也是不一样的,当然大多数这样人结果是不满足分页要求的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行