2016-06-20 2 views
1

Я использую аналитическую функцию для расчета скользящей 24-часовой суммы расходов на одного клиента в моей таблице транзакций. Функция, используемая для работы, однако поле trx_datetime было недавно изменено с даты на timestamp (9).Oracle 11g Analytics Functions SUM

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, но не смогли найти способ, чтобы исправить ошибку. Если вы знаете, как настроить порядок функций аналитики по инструкции для работы с отметкой времени, пожалуйста, дайте мне знать.

ответ

0

Вы получаете эту ошибку, потому что ваш диапазон использует целые числа (что отлично работает с арифметикой даты, так как это вычисляется в количествах дней), тогда как арифметика timestamp использует интервалы.

Поэтому вам нужно конвертировать ваши диапазоны в промежутки время, которые вы можете сделать с помощью 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; 

, потому что, когда вы используете windowing with range, «текущая строка» соответствует «строкам с тем же значением, что и текущая строка».

+1

Большое вам спасибо. Это сделал трюк! –