Liczenie czasów między wierszami

0

Witam bazodanowców,

załóżmy, że mam tabelę "operacje" z dwoma kolumnami: id_operacji i data. Jsk policzyć czas między wierszami?
Tzn dla wiersza nr 1 , czas ma się równać = data z wiersza drugiego -data z wiersza pierwszego. Jakie połączenie zastosować? potrafię policzyć czasy ale tylko narastająco w pętli, tzn od wartości maksymalnej odejmuje każdy rekord, natomiast chcę policzyć czas między wierszami. Proszę o pomoc

Ps. baza danych Oracle- ale proszę się tym nie sugerować, potrzebuje samą idee;)

Pozdrawiam

1

Rekursywne CTE. Później napiszę więcej, na razie na to looknij.

2

Cześć,
funkcja okna wydaje się być stworzona do Twojego problemu ;-)
Stworzyłem taką oto tabelę:

create table test6 (

id int not null primary key,
date1 datetime
)

insert into test6(id,date1)
values 
(1,'20101010'),
(2,'20111010'),
(3,'20120202'),
(4,'20130505');

Teraz wybierając wszystkie rekordy z tej tabeli otrzymujemy:
31e07c0ba7.png

Teraz stosujemy funkcje okna+datediff:

select id,date1, datediff (month,date1,lead(date1,1) over (order by date1)) as różnicawmiesiącachmiędzyobecnymwierszemijednympozniej
from test6

Słowo wyjaśnienia, używasz funkcji datediff, która obliczy Ci różnice(w tym przypadku w miesiącach, ale możesz to zmienić) między 2 datami.
funkcja okna lead(date1,1) oznacza, że zostanie pobrana data(date1) z jednego wiersza później od obecenego z atrybutu/kolumny date1.

Żeby wszystko było jasne:
datediff(miesiąc/rok/dzień i kilka jeszcze innych opcji (wybierz właściwą), "data z obecnego wiersza w tabeli", 'data z wiersza z tabeli jednego później').

wynik:
c1951cb2ce.png

Pozdrawiam, i w razie czego pytaj ;-)

EDIT:Używam SQL SERVER, ale z łatwością to zamienisz na Oracle.

0

Dziękuje za wyczerpującą odpowiedź. Później napisze czy i jak mi się udało. :)

0

Funkcja LEAD to strzał w dziesiątkę, tego mi brakowało - wielkie dzięki!
Funkcja DateDiff w Oracle nie jest zaimplementowana, mozna natomiast stworzyc podobną w taki sposób:

CREATE OR REPLACE FUNCTION daj_roznice (data1 IN DATE, data2 IN DATE)
   RETURN VARCHAR2
IS
   wartosc   VARCHAR2 (10);
BEGIN
   wartosc := TO_CHAR (((data1 - data2) * 86400), '99999');
   RETURN (wartosc);
END;

Moje rozwiązanie bez kreowania funkcji :

SELECT id_operacji, data1, LEAD (data1, 1) OVER (ORDER BY data1) AS data2,
       TO_CHAR (((LEAD (data1, 1) OVER (ORDER BY data1)) - data1) * 86400,
                '9999') AS różnica -- Format ustalam w zależności jak długich odstępów czasowych  mogę się spodziewać, w tym przypadku są  to sekundy.
  FROM operacje
  

Dzięki jeszcze raz za pomoc. ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1