Oracle 11g Analytics功能SUM

时间:2016-06-20 14:08:19

标签: sql oracle11g sum timestamp oracle-analytics

我使用分析函数计算每个客户在我的交易表中的滚动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 个答案:

答案 0 :(得分:0)

您收到该错误是因为您的范围使用整数(使用日期算法可以正常工作,因为它以天数计算),而时间戳算术使用间隔。

因此,您需要将范围转换为区间,您可以使用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;

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