Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: [postgreSQL] Ostatni i przed...

Witam!
Jako że pSQL jest dla mnie jeszcze nowy, to męczę się z jednym zapytaniem:
SELECT 
klient,
rank() OVER w lp,
first_value(sklep) OVER w pierwszy,
first_value(data_transakcji) OVER w pierwszy_data,
nth_value(sklep, 2) OVER w drugi,
nth_value(data_transakcji, 2) OVER w drugi_data
FROM
transakcje t
WINDOW w AS (PARTITION BY klient ORDER BY data_transakcji DESC)

Generalnie chodzi mi o to, by pokazać dla każdego klienta TYLKO ostatni i przedostatni zakup. W jednym rekordzie.
Jako że tabela jest "kosmiczna", więc bez wykorzystania podzapytań - chciałem użyć funkcji grupujących z postgreSQL-a.
Ale coś nie wychodzi, bo dla rekordów z lp=1 drugi jest pusty. No i oczywiście wyświetla tyle rekordów, ile jest w tabeli...

Z góry dzięki

konto usunięte

Temat: [postgreSQL] Ostatni i przed...

a próbowałeś with () ?
Paweł Grzegorz Kwiatkowski

Paweł Grzegorz Kwiatkowski Architekt
oprogramowania,
Ericsson

Temat: [postgreSQL] Ostatni i przed...

1. Wyświetla tyle rekordów ile jest w tabeli, bo liczysz wartość funkcji per okno. Funkcję wywołujesz per rekord.

2. Przy definicji okna bazujesz na domyślnym ustawieniu frame_clause, proponuję sprawdzić inne ustawienia, w szczególności: ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

konto usunięte

Temat: [postgreSQL] Ostatni i przed...

(wypowiedź skasowana - nie zauważyłem że to tak naprawdę limitowanie grupy)Piotr L. edytował(a) ten post dnia 27.03.12 o godzinie 13:16
Przemysław Kantyka

Przemysław Kantyka Oracle Certified
Professional, Oracle
Database SQL
Certif...

Temat: [postgreSQL] Ostatni i przed...

Ogólny opis na blogu:
http://blog.dataconsulting.pl/2012/03/pierwszy-drugi-n...

Czyli u Ciebie będzie:


SELECT klient, pierwszy, pierwszy_data, drugi, drugi_data FROM (
SELECT
klient,
row_number() OVER w lp,
first_value(sklep) OVER w pierwszy,
first_value(data_transakcji) OVER w pierwszy_data,
nth_value(sklep, 2) OVER w drugi,
nth_value(data_transakcji, 2) OVER w drugi_data,
FROM
transakcje t
WINDOW w AS (PARTITION BY klient ORDER BY data_transakcji DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING )) q WHERE lp = 1



PozdrawiamPrzemysław Kantyka edytował(a) ten post dnia 28.03.12 o godzinie 22:59
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: [postgreSQL] Ostatni i przed...

Przemek R. - nie chciałem dawać WITH, bo nie wiem jak dokładnie działają rekurencje w bazach. A jak już wspomniałem tabela jest olbrzymia.
Okazało się, że ten ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING pomógł.
Dzięki

Następna dyskusja:

zapytanie w PostgreSQL




Wyślij zaproszenie do