首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle11g分析函数和

Oracle11g分析函数和
EN

Stack Overflow用户
提问于 2016-06-20 14:08:18
回答 1查看 449关注 0票数 1

在我的交易表中,我使用一个解析函数来计算每个客户24小时滚动的花费金额。但是,trx_datetime字段最近从date更改为timestamp(9)。

代码语言:javascript
复制
    select sum(th.amount) 
        over(partition by th.customer_id 
        order by th.trx_datetime
        range between 1 preceding and 0 following) as rolling_trx_amt 
from transactions th;

现在,当我运行查询时,会得到以下错误。

代码语言:javascript
复制
ORA-00902: invalid datatype
00902. 00000 -  "invalid datatype"

为了找到解决方案,我已经搜索了几个小时,并在th.trx_datetime上尝试了无数次转换,但一直未能找到纠正错误的方法。如果您知道如何使分析函数按语句顺序使用时间戳,请告诉我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-20 14:19:01

您会得到这个错误,因为您的范围使用整数(这与日期算法很好,因为这是以天数计算的),而时间戳算法使用间隔。

因此,您需要将您的范围转换为间隔,您可以使用numtodsinterval这样做,如下所示:

代码语言:javascript
复制
select sum(th.amount) 
        over(partition by th.customer_id 
        order by th.trx_datetime
        range between numtodsinterval(1, 'DAY') preceding
                  and numtodsinterval(0, 'DAY') following) as rolling_trx_amt 
from transactions th;

您还可以将其重写为:

代码语言:javascript
复制
select sum(th.amount) 
        over(partition by th.customer_id 
        order by th.trx_datetime
        range between numtodsinterval(1, 'DAY') preceding
                  and current row) as rolling_trx_amt 
from transactions th;

因为当您使用包含范围的窗口子句时,"current row“等同于”具有与当前行相同值的行“。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37924672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档