Oracle 11g 分析函数 SUM
Oracle 11g Analytics Functions SUM
我正在使用分析函数来计算交易中每个客户的 24 小时滚动消费金额 table。该函数曾经有效,但是 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 上尝试了无数次转换,但一直未能找到更正错误的方法。如果您知道如何通过语句获取分析函数顺序以使用时间戳,请告诉我。
您收到该错误是因为您的范围使用整数(这适用于日期算法,因为它以天数计算),而时间戳算法使用间隔。
因此您需要将范围转换为区间,您可以使用 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;
因为当您使用带范围的窗口子句时,"current row" 等同于 "rows with the same value as the current row"。
我正在使用分析函数来计算交易中每个客户的 24 小时滚动消费金额 table。该函数曾经有效,但是 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 上尝试了无数次转换,但一直未能找到更正错误的方法。如果您知道如何通过语句获取分析函数顺序以使用时间戳,请告诉我。
您收到该错误是因为您的范围使用整数(这适用于日期算法,因为它以天数计算),而时间戳算法使用间隔。
因此您需要将范围转换为区间,您可以使用 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;
因为当您使用带范围的窗口子句时,"current row" 等同于 "rows with the same value as the current row"。