2016-06-20 11 views
1

Ich verwende eine analytische Funktion, um einen rollenden 24-Stunden-Ausgabenbetrag pro Kunde in meiner Transaktionstabelle zu berechnen. Die Funktion, mit der gearbeitet wurde, jedoch wurde das Feld trx_datetime kürzlich von Datum zu Zeitstempel geändert (9).Oracle 11g Analytics-Funktionen SUMME

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; 

Jetzt, wenn ich die Abfrage ausführen, erhalte ich den folgenden Fehler.

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

ich gesucht habe stundenlang eine Lösung zu finden und versuchte unzählige Umbauten auf th.trx_datetime aber nicht in der Lage gewesen, einen Weg finden, um den Fehler zu korrigieren. Wenn Sie wissen, wie Sie die Analysefunktion nach Anweisung mit einem Zeitstempel arbeiten können, lassen Sie es mich wissen.

Antwort

0

Sie erhalten diesen Fehler, weil Ihr Bereich Integer verwendet (was mit Datumsarithmetik funktioniert, da diese in Anzahl von Tagen berechnet wird), während die Zeitstempelarithmetik Intervalle verwendet.

Deshalb müssen Sie Ihre Bereiche in Intervalle konvertieren, die Sie numtodsinterval mit tun können, etwa so:

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; 

Sie könnten auch diese umschreiben als:

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; 

, weil, wenn Sie eine verwenden Windowing-Klausel mit Bereich "aktuelle Zeile" entspricht "Zeilen mit demselben Wert wie die aktuelle Zeile".

+1

Vielen Dank. Das hat den Trick gemacht! –