Porównanie danych z jednej kolumny

0

Z poniższej tabelki potrzebuję wyciągnąć pesele, dla których dochód zmienił się o 500zł pomiędzy kolejnymi datami.
Zapytanie będzie odpalane co jakiś czas, dlatego nie może to być jednorazowe rozwiązanie…
Prośba o pomoc

ID | DATA | PESEL | DOCHOD
1 | 2016-10-01 | 111222 | 1000
2 | 2016-10-02 | 111222 | 2000
3 | 2016-10-01 | 112233 | 500
4 | 2016-10-03 | 112233 | 700
5 | 2016-10-05 | 112233 | 900
6 | 2016-10-03 | 123456 | 2000
7 | 2016-10-05 | 123456 | 2000

0

Na szybko. Pokazuje różnice pomiędzy wszystkimi datami :(, nie tylko pomiędzy sąsiednimi.

SELECT t1.data, t1.pesel, t1.dochod, t2.data, t2.dochod, t1.dochod-t2.dochod AS roznica
FROM t1 AS t2 RIGHT JOIN t1 ON t2.pesel = t1.pesel
WHERE t2.data<t1.data AND (t1.dochod-t2.dochod)>500
0

https://msdn.microsoft.com/en-us/library/hh231256.aspx myślę, że przykład tam wyjaśnia wszystko

0

Świetna funkcja, niestety pracuje na SQL2008:(
Czy jest szansa żeby ulepszyć tą pierwszą wersję?

1

Na postgreSQL, bo nie chciało mi się na MS. Ale to "czysty SQL", więc wszędzie powinno pójść:

/* -- tworzenie tabeli i danych 
BEGIN

CREATE TEMP TABLE table1
    (ID int, DZIEN date, PESEL int, DOCHOD int)
ON COMMIT DROP
;
    
INSERT INTO Table1
    (ID, DZIEN, PESEL, DOCHOD)
VALUES
    (1, '2016-10-01 00:00:00', 111222, 1000),
    (2, '2016-10-02 00:00:00', 111222, 2000),
    (3, '2016-10-01 00:00:00', 112233, 500),
    (4, '2016-10-03 00:00:00', 112233, 700),
    (5, '2016-10-05 00:00:00', 112233, 900),
    (6, '2016-10-03 00:00:00', 123456, 2000),
    (7, '2016-10-05 00:00:00', 123456, 2000)
;
*/
select x.*, t.dochod, x.dochod-t.dochod roznica from (
select DZIEN,PESEL,DOCHOD,(SELECT Max(DZIEN) FROM table1 WHERE PESEL=t.PESEL and DZIEN<t.DZIEN) poprzedni FROM table1 t
  ) x JOIN table1 t ON t.dzien=x.poprzedni AND t.pesel=x.pesel
WHERE x.dochod-t.dochod  /* czyli roznica */ >=500;

Sprawdz sobie zarowno z WHERE jak i bez niego.
Sprawdz tez co się stanie, gdy zamienisz JOIN na LEFT JOIN

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