Witam
Oprócz tabeli danych klientów, których windykuję, mam drugą prostą tablicę (w Postgresie), która zapisuje statusy tych klientów w czasie (np. aktywny/nieaktywny) kilka razy w ciągu tygodnia na życzenie użytkownika. W związku z tym, że muszę przygotowywać zestawienia cyklicznie tygodniowo/miesięcznie wraz z informacją, czy dany klient jest aktywny, czy nie, potrzebuję pomocy w napisaniu selecta, który pokazywałby dane klientów z pierwszej tabeli i zestawił ich statusy w ujęciu - koniec zeszłego tygodnia (-1), koniec tygodnia wcześniejszego(-2) i analogicznie odnośnie miesięcy. Przykładowe tablice:
- public.klienci (tabela pokazująca aktualny stan klienta, czy ma aktywną umowę czy nie):
idklienta klient status
50 Firma A Nieaktywny
74 Firma B Nieaktywny
85 Firma C Aktywny
109 Firma D Aktywny
- public.statusy_historia:
id idlienta datastatusu status
1 50 2021-01-21 Aktywny
2 74 2021-01-21 Nieaktywny
3 85 2021-01-21 Aktywny
4 109 2021-01-21 Aktywny
230 50 2021-02-21 Aktywny
231 74 2021-02-21 Nieaktywny
232 85 2021-02-21 Aktywny
233 109 2021-02-21 Aktywny
459 50 2021-03-21 Aktywny
460 74 2021-03-21 Nieaktywny
461 85 2021-03-21 Aktywny
462 109 2021-03-21 Aktywny
68 50 2021-04-21 Aktywny
689 74 2021-04-21 Nieaktywny
690 85 2021-04-21 Aktywny
691 109 2021-04-21 Aktywny
917 50 2021-05-03 Nieaktywny
918 74 2021-05-03 Nieaktywny
919 85 2021-05-03 Aktywny
920 109 2021-05-03 Aktywny
1146 50 2021-05-10 Nieaktywny
1147 74 2021-05-10 Nieaktywny
1148 85 2021-05-10 Aktywny
1149 109 2021-05-10 Aktywny
1375 50 2021-05-16 Nieaktywny
1376 74 2021-05-16 Nieaktywny
1377 85 2021-05-16 Aktywny
1378 109 2021-05-16 Aktywny
1604 50 2021-05-18 Nieaktywny
1605 74 2021-05-18 Nieaktywny
1606 85 2021-05-18 Aktywny
1607 109 2021-05-18 Aktywny
1833 50 2021-05-21 Nieaktywny
1834 74 2021-05-21 Nieaktywny
1835 85 2021-05-21 Aktywny
1836 109 2021-05-21 Aktywny
gdzie 1 kolumna "id" to po prostu kolejny numer z sekwencji.
To co chcę uzyskać to 2 warianty tabeli klientów pokazujące dane poprzednich statusów.
Pierwszy pokazujący jaki miał status w zeszłym tygodniu i 2 tygodnie temu (status wzięty z ostatniej daty z danego tygodnia/m-ca) czyli:
idklienta klient tydzień(-2) tydzień (-1) status_aktualny
50 Firma A ? ? Nieaktywny
74 Firma B ? ? Nieaktywny
85 Firma C ? ? Aktywny
109 Firma D ? ? Aktywny
gdzie w znakach zapytania powinny pojawić się statusy odpowiadające najnowszej dacie z poprzedniego tygodnia, tygodnia (-2)
Drugi wariant w przypadku miesięcy analogicznie po najnowszej dacie w tabeli statusy_historia dotyczącej poprzedniego miesiąca, miesiąca (-2), czyli:
idklienta klient miesiąc(-2) miesiąc (-1) status_aktualny
50 Firma A ? ? Nieaktywny
74 Firma B ? ? Nieaktywny
85 Firma C ? ? Aktywny
109 Firma D ? ? Aktywny
Próbowałem już z numerami tygodni poprzez klauzule takie jak:
tydzien >= (extract('week' from current_date)-1
ale zwracało mi błąd typu:
BŁĄD: ponad jeden wiersz zwrócony przez podzapytanie użyte jako wyrażenie
Stan SQL: 21000
Select mój obecnie wygląda tak:
SELECT idklienta,
klient,
--w tym miejscu powinien się znaleźć select odwołujący się do bazy statusów i pokazujący status (-2) tygodnia lub miesiąca zależnie od wariantu,
--w tym miejscu powinien się znaleźć select odwołujący się do bazy statusów i pokazujący status (-1) tygodnia lub miesiąca zależnie od wariantu,
status_aktualny
FROM klienci k ORDER BY k.idklienta
Nie posiadam zaawansowanej wiedzy odnośnie SQL'a i potrzebowałbym pomocy. Co powinienem wstawić w miejsca komentarzy powyższego selecta, żeby "łapało" mi ostatni status z wcześniejszych tygodni/miesięcy?
Zapewne dla wielu Forumowiczów to zadanie ze szkoły ale nie potrafię sobie z tym poradzić i będę wdzięczny za pomoc. Z góry dziękuję