2017-11-09 1 views
0

Ich habe mich umgesehen und ein paar Posts mit LAG() gefunden und Abfragen vom Typ "Gesamt" ausgeführt, aber keines scheint zu dem zu passen, wonach ich suche. Vielleicht benutze ich nicht die richtigen Begriffe bei meiner Suche oder vielleicht übertreibe ich die Situation. Hoffe jemand könnte mir helfen.Können wir die vorherige Zeile ändern und sie in der aktuellen Zeile in einer SQL-Abfrage für eine Liste verwenden?

Aber was ich suche, ist, das vorherige Ergebnis zu nehmen und es für eine Reihe von Daten durch die aktuelle Reihe zu multiplizieren. Der Start ist immer einige Basis-Nummer lässt 10, um es einfach zu halten. Die Werte werden float sein, aber ich habe es hier auf runden Zahlen gehalten, um meine Anfrage besser zu erklären.

Die erste zeigt den Berechnungsteil und die zweite Tabelle unten zeigt, wie das Ergebnis am Ende aussehen soll.

date  val1 calc_result 
20120930 null 10 
20121031 2 10*2=20 
20121130 3 20*3=60 
20121231 1 60*1=60 
20130131 2 60*2=120 
20130228 1 120*1=120 

Die Abfrage würde

Rückkehr
20120930 10 
20121031 20 
20121130 60 
20121231 60 
20130131 120 
20130228 120 

Ich versuche, wenn dies in einer Abfragetyp Lösung getan werden kann, um zu sehen, oder wäre eine PL/SQL-Tabelle/Cursor müssen verwendet werden?

Jede Hilfe wäre willkommen.

+0

Was hast du probiert ????? SO ist kein kostenloser Codierdienst. Sie posten Ihre Anfrage. Wenn es nicht das richtige Ergebnis liefert, erklären Sie, was falsch ist, was die erwartete Ausgabe ist. Dann können wir helfen. – Eric

Antwort

1

Sie können dies mit einem rekursiven CTE:

with dates as (
     select t.*, row_number() over (order by date) as seqnum 
     from t 
    ), 
    cte as (
     select t.date, t.val, 10 as calc_result 
     from dates t 
     where t.seqnum = 1 
     union all 
     select t.date, t.val, cte.calc_result * t.val 
     from cte join 
      dates t 
      on t.seqnum = cte.seqnum + 1 
    ) 
select cte.date, cte.calc_result 
from cte 
order by cte.date; 
+0

Ok, ich habe mit diesem gespielt und es scheint zu funktionieren. Ich musste über diesen [link] (http://www.dba-oracle.com/t_common_table_expression_cte.htm) nachlesen, was CTE war. Ich werde das weiter modifizieren und Ihnen mitteilen. – user2025696

1

Dies ist ein kumulatives Produkt zu berechnen. Sie können es mit einer exponentiellen Arithmetik tun. Ersetzen Sie 10 in der Abfrage mit dem gewünschten Startwert.

select date,val1 
,case when row_number() over(order by date) = 1 then 10 --set start value for first row 
else 10*exp(sum(ln(val1)) over(order by date)) end as res 
from tbl 
+0

Dies ist nahe, aber es scheint, dass auch die erste Reihe multipliziert wird und der Rest der Zahlen aus ist. Die erste Zeile sollte also immer 10 oder die gesetzte Nummer sein, die zweite Zeile ist prev_row * curr_row, was 10 * 2 ist. Die Probe, die Sie zur Verfügung gestellt haben, zeigt 10, aber die zweite Zeile wird nicht mit 10 multipliziert, sondern mit dem Produkt dieser 10 * curr_row. – user2025696

Verwandte Themen