Jak pobrać rekord dla okresu zapisanego w tabeli?

0

Witam. Mam tabelę, w której przechowywane są archiwalne dane klienta w taki sposób, że dana jest tylko data do kiedy one obowiązują, a nie od kiedy. Tak więc jeśli są trzy rekordy reprezentujące Jana Kowalskiego i w kolumnie z datą jest 15 listopada 2023, 1 grudnia 2023 oraz 15 stycznia 2024 to pierwszy rekord reprezentuje dane od: minus nieskończoność do 15-go listopada, drugi od 15-go listopada do 1-go grudnia, a trzeci od 1-go grudnia do 15 stycznia tego roku. Powiedzmy, że chcę dodać kolumnę "dane_od", ale nie chcę ich wpisywać ręcznie tylko przez jakiś select albo pętlę dodać dane w tej tabeli. Ktoś wie może jak to zrobić?

0

Można np. stworzyć migrację i dodać za jej pomocą kolumnę i wyliczyć odpowiednie dane (bezpośrednio w tej migracji, albo osobno), pasuje dodać wtedy też np. trigger, który przy każdym nowym insercie wypełni tą kolumnę. Można też zamiast triggers zrobić to po stronie aplikacji. Z informacji, które podałeś, ja tylko tak potrafię pomóc.

2

Można to zrobić tak:
https://www.db-fiddle.com/f/axLNrQyrkEakh1k3TzVRnr/0
Uzywając funkcji LEAD i LAG

0

Kolega przyszedł z takim, a nie innym pytaniem, więc obawiam się, że właśnie mu zasugerowałeś by stworzył osobną kolumnę, a nie tylko zrobił Alter

0

Dane które teraz masz w bazie są wystarczające żeby wykonać operacje które chcesz, więc ja bym nie dodawał żadnej nowej kolumny (to otworzy drzwi dla dodanie niepoprawnych wartości).

Ja bym na Twoim miejscu zrobił widok (ewentualnie zmaterializowany widok) który prezentuje dane w takiej postaci w jakiej chcesz. No albo sam SELECT, jak pisze @Marcin.Miga.

0

Dzięki serdecznie wszystkim za pomoc. Ostatecznie doszedłem do wniosku, że nie jest konieczne dodanie nowej kolumny, a wersję danych klienta dla daty transakcji mogę wyciągnąć przez taki widok:

CREATE OR REPLACE VIEW public."wersja_danych_klienta"
	AS  SELECT k._id AS id,
          pola_nazwa_adres_itd,
            '9999-12-31'::date AS data
           FROM klient k
        UNION
         SELECT kv.analogiczne_pola_jak_powyzej_z_tabeli_wersji,
            kv.sdata
           FROM klient_ver kv;

I teraz żeby na wykazie dokumentów dla każdej transakcji mieć dane klienta z czasu gdy była zawierana, to zrobiłem mniej więcej takiego selecta:

select 
dane_klienta,
dane_transakcji
from tabela_transakcji left join wersja_danych_klienta on tabela_transakcji.id_platnika = wersja_danych_klienta.id_klienta
where data = (select data from "wersja_danych_klienta" wdk where id = tabela_transakcji.id_platnika and data >= tabela_transakcji.data order by data limit 1)  

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