Oracle 11g 分析函数 SUM

Posted

技术标签:

【中文标题】Oracle 11g 分析函数 SUM【英文标题】:Oracle 11g Analytics Functions SUM 【发布时间】:2016-06-20 14:08:18 【问题描述】:

我正在使用分析函数来计算我的交易表中每位客户的 24 小时滚动消费金额。该函数曾经可以工作,但是 trx_datetime 字段最近已从日期更改为时间戳 (9)。

    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;

现在,当我运行查询时,出现以下错误。

ORA-00902: invalid datatype
00902. 00000 -  "invalid datatype"

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

【问题讨论】:

【参考方案1】:

您收到该错误是因为您的范围使用的是整数(这适用于日期算术,因为它是以天数计算的),而时间戳算术使用间隔。

因此,您需要将范围转换为区间,您可以使用 numtodsinterval 执行此操作,如下所示:

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;

你也可以这样改写:

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;

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

【讨论】:

以上是关于Oracle 11g 分析函数 SUM的主要内容,如果未能解决你的问题,请参考以下文章

oracle分析函数问题

oracle 分析函数问题

oracle 分析函数 - 总结

oracle累积求和分析函数sum over的使用

oracle累加分析函数

Oracle-分析函数_总结