匿名用户
1级
2015-06-29 回答
last_value 默认的统计区间是开始行到当前行,类似累加的处理方式,所以需要指定一下统计区间,例子:
select distinct r.user_id,
last_value(r.cell ignore nulls) over(partition by r.user_id order by r.store_time desc rows between unbounded preceding and unbounded following) as cell
from test1 r;
追问:
但取出来的不是最后一条的cell,是中间时间段的cell的。这要怎么改?
追答:
你确定是中间的么, 目前这个是不为空的数据中取时间最早的, 取时间最晚就是改下order by 就行了
追问:
嗯,取出来的确实是中间时间的数据,不过是默认排序的第一个。说明order by r.store_time desc 完全不起作用。
追答:
我测试没问题的.
SQL> select * from test1 r order by user_id,r.store_time desc;
USER_ID STORE_TIME CELL
---------- ----------- ----------
A 2015-07-28
A 2015-07-22
A 2015-07-16 9
A 2015-07-15
A 2015-07-14 7
A 2015-07-13 3
A 2015-07-11
A 2015-07-10
A 2015-07-06 4
A 2015-07-02
B 2015-07-16
B 2015-07-11 2
B 2015-07-02
13 rows selected
SQL>
SQL> select distinct r.user_id,
2 last_value(r.cell ignore nulls) over(partition by r.user_id order by r.store_time desc rows between unbounded preceding and unbounded following) as cell
3 from test1 r;
USER_ID CELL
---------- ----------
A 4
B 2
在Oracle数据库中,使用last_value函数配合over()部分,通过指定统计区间和排序条件来获取每个用户ID的最后一条非空cell数据。当发现查询结果并非预期的最后一条记录时,可能需要检查order by子句是否正确设置。示例SQL展示了如何根据store_time降序获取数据。
1101

被折叠的 条评论
为什么被折叠?



