代码之家  ›  专栏  ›  技术社区  ›  Bill Brasky

Oracle 11g分析功能SUM

  •  1
  • Bill Brasky  · 技术社区  · 9 年前

    我正在使用一个分析函数来计算我的交易表中每个客户的滚动24小时消费额。该函数过去可以工作,但trx_datetime字段最近从date更改为timestamp(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上尝试了无数次转换,但仍然无法找到纠正错误的方法。如果您知道如何使用时间戳获取分析函数order by statement。

    1 回复  |  直到 9 年前
        1
  •  0
  •   Boneist    9 年前

    您之所以会出现这种错误,是因为您的范围使用的是整数(这与日期算法很匹配,因为它是以天数计算的),而时间戳算法使用的是间隔。

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

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

    推荐文章