Rafał Mieszkowski

Rafał Mieszkowski Student, Wojskowa
Akademia Techniczna

Temat: zapytanie do archiwum

Witam,
Mam kartoteki w bazie, które mogą być modyfikowane tzn.
jeśli ma kartę klienta i nastąpi jej modyfikacja to zostanie utworzona nowa karta klienta z nowym ID dokumentu a stara staje się nieaktywna ale możliwa do wglądu.

Wizualnie wygląda tak:
111111 - karta aktywna
111111a - karta nieaktywna
111111b - karta nieaktywna

teraz chciałbym porównać co uległo zmianie porównując kartę aktywną 111111 z karta nieaktywną 111111a jak mogę to wykonać. Jedynym rekordem informującym mi jest data wprowadzenie każdej z kart do systemu. Wiadomo że karta nieaktywna będzie miała starszą datę niż karta aktywna - to logiczne.

Wiem jak wyświetlić dane z kart aktywnej to jak sięgnąć do karty o numerze 111111a ?

Wiem że wszystkie karty są spięte do jednego właściciela po np. numerze NIP

konto usunięte

Temat: zapytanie do archiwum

Normalne to są dwa rozwiązania... Jedno zakłada, że wszystkie karty mają to samo, wspólne id - w sensie - jedno to te 111111 i drugie pozwalające wyciągnąć wszystkie wersje danego rekordu. Drugie rozwiązanie zakłada, że 111111 "zna" wersję, z której zostało zrobione i taką informację się przechowuje. Pierwsze rozwiązanie ma sens o tyle, że można wskazać powiązanie do zawsze aktualnej wersji.
Z nienormalnych - można wybrać wszystkie rekordy, które jakoś tam pasują do siebie i powróżyć w celu wybrania właściwego zestawu...

konto usunięte

Temat: zapytanie do archiwum

Michał Z.:
Normalne to są dwa rozwiązania... Jedno zakłada, że wszystkie karty mają to samo, wspólne id - w sensie - jedno to te 111111 i drugie pozwalające wyciągnąć wszystkie wersje danego rekordu. Drugie rozwiązanie zakłada, że 111111 "zna" wersję, z której zostało zrobione i taką informację się przechowuje. Pierwsze rozwiązanie ma sens o tyle, że można wskazać powiązanie do zawsze aktualnej wersji.
Z nienormalnych - można wybrać wszystkie rekordy, które jakoś tam pasują do siebie i powróżyć w celu wybrania właściwego zestawu...

Ale tutaj jest tak, że NIP jest stały, a id się zmienia i je ignorujemy. A zatem, żeby wyciągnąć aktualnie aktywny rekord, trzeba by: SELECT * FROM x WHERE nip = '???' ORDER BY data_wpisania DESC LIMIT 1. Natomiast kolejny: SELECT * FROM x WHERE nip = '???' ORDER BY data_wpisania DESC LIMIT 1 OFFSET 1;

konto usunięte

Temat: zapytanie do archiwum

Szymon L.:
Michał Z.:
Normalne to są dwa rozwiązania... Jedno zakłada, że wszystkie karty mają to samo, wspólne id - w sensie - jedno to te 111111 i drugie pozwalające wyciągnąć wszystkie wersje danego rekordu. Drugie rozwiązanie zakłada, że 111111 "zna" wersję, z której zostało zrobione i taką informację się przechowuje. Pierwsze rozwiązanie ma sens o tyle, że można wskazać powiązanie do zawsze aktualnej wersji.
Z nienormalnych - można wybrać wszystkie rekordy, które jakoś tam pasują do siebie i powróżyć w celu wybrania właściwego zestawu...

Ale tutaj jest tak, że NIP jest stały, a id się zmienia i je ignorujemy. A zatem, żeby wyciągnąć aktualnie aktywny rekord, trzeba by: SELECT * FROM x WHERE nip = '???' ORDER BY data_wpisania DESC LIMIT 1. Natomiast kolejny: SELECT * FROM x WHERE nip = '???' ORDER BY data_wpisania DESC LIMIT 1 OFFSET 1;

Skoro tak to źle zrozumiałem. Dla mnie to jest tak, że mogę mieć wiele kart - jako właściciel. No a karta jak to karta - może mieć swoją historię... Dlatego właśnie nasmarowałem całą wypowiedź.

Tak na marginesie - taki design jest trochę bez sensu, ale co zrobić - ktoś zaprojektował, trzeba sobie radzić.
Rafał Mieszkowski

Rafał Mieszkowski Student, Wojskowa
Akademia Techniczna

Temat: zapytanie do archiwum

ok sprawdzę podane rozwiązania.
Mam wgląd tylko do danych w bazie, ponieważ dostawca oprogramowania ukrywa wszelkie informacje o powiązaniach pomiędzy tabelami itp. itd.
Rafał Mieszkowski

Rafał Mieszkowski Student, Wojskowa
Akademia Techniczna

Temat: zapytanie do archiwum

OK
Jeśli zastosuje rozwiązanie :
"
A zatem, żeby wyciągnąć aktualnie aktywny rekord, trzeba by: SELECT * FROM x WHERE nip = '???' ORDER BY data_wpisania DESC LIMIT 1. Natomiast kolejny: SELECT * FROM x WHERE nip = '???' ORDER BY data_wpisania DESC LIMIT 1 OFFSET 1;
"
Podam NIP to wyciągnie mi informację dotyczące tego jednego klienta.
Ale potrzebuję zastosować zapytanie do wszystkich rekordów z bazy, tzn. tych które mają jedną kartotekę i tych które mają dwie kartoteki i więcej tylko zagłębiam się do drugiej kartoteki tylko.
Jak mam to napisać ?

konto usunięte

Temat: zapytanie do archiwum

W ogólności - jak się posortuje po NIPie - wtedy będzie można się poruszać po rekordach, mając dane historyczne pod ręką.
Wybranie N-ostatnich zrobiłbym funkcją okienkową:
http://www.postgresql.org/docs/9.1/static/tutorial-win...

Przykład ze strony:
SELECT *, rank() OVER (PARTITION BY nip ORDER BY data DESC) FROM kartoteka;
Chodzi o to, że grupujemy rekordy po nipie, potem sortujemy po dacie dodania. Dla każdego takiego zestawu robimy rank. Założenie jest takie, że dany rekord w danym czasie może być edytowany tylko raz. Wtedy każdy dostanie kolejny numerek i można przefiltrować po rank() < 2 - i mamy aktualny i poprzedni.
Rafał Mieszkowski

Rafał Mieszkowski Student, Wojskowa
Akademia Techniczna

Temat: zapytanie do archiwum

OK to mam takie zapytanie, wynik zwracany jest poprawnie

select eksport_20160326.deklaracje.data_utworzenia, eksport_20160326.nieruchomosci_deklaracje.id_nieruchomosc as "z nieruchomości dekla", eksport_20160326.nieruchomosci.id as "z nieruchomości" ,
eksport_20160326.deklaracje.dek_rodz_okoliczonosci, eksport_20160326.deklaracje.status_archiwum,
eksport_20160326.nieruchomosci.stat_dekl, eksport_20160326.nieruchomosci.stat_dekl_nowa, eksport_20160326.nieruchomosci.stat_dekl_korekta, eksport_20160326.nieruchomosci.rz_wylacz,
eksport_20160326.nieruchomosci.status, eksport_20160326.nieruchomosci.status_deklaracji,
eksport_20160326.deklaracje.id,

dense_rank() OVER (PARTITION BY eksport_20160326.nieruchomosci_deklaracje.id_nieruchomosc ORDER BY eksport_20160326.deklaracje.data_utworzenia DESC) "rank"

from eksport_20160326.deklaracje

LEFT JOIN eksport_20160326.nieruchomosci_deklaracje on eksport_20160326.deklaracje.id = eksport_20160326.nieruchomosci_deklaracje.id_deklaracja
LEFT JOIN eksport_20160326.deklaracje_oplaty on eksport_20160326.deklaracje.id = eksport_20160326.deklaracje_oplaty.id_deklaracja
left join eksport_20160326.nieruchomosci on eksport_20160326.nieruchomosci_deklaracje.id_nieruchomosc = eksport_20160326.nieruchomosci.id

where eksport_20160326.nieruchomosci_deklaracje.id_nieruchomosc > '0' and eksport_20160326.nieruchomosci_deklaracje.id_nieruchomosc in ('983872')

group by
eksport_20160326.nieruchomosci.id,eksport_20160326.nieruchomosci.stat_dekl, eksport_20160326.nieruchomosci.stat_dekl_nowa, eksport_20160326.nieruchomosci.stat_dekl_korekta,eksport_20160326.nieruchomosci.rz_wylacz,
eksport_20160326.nieruchomosci.status, eksport_20160326.nieruchomosci.status_deklaracji,eksport_20160326.deklaracje.id,
eksport_20160326.deklaracje.data_utworzenia, eksport_20160326.nieruchomosci_deklaracje.id_nieruchomosc, eksport_20160326.deklaracje.dek_rodz_okoliczonosci, eksport_20160326.deklaracje.status_archiwum

tylko jak mam mam zastosować rank() < 2 ?
w warunkach where ? nie działa woła o funkcję OVERTen post został edytowany przez Autora dnia 01.04.16 o godzinie 11:23

konto usunięte

Temat: zapytanie do archiwum

w googla wpisałem postgresql rank limit - pierwszy link ze stack overflow:
http://stackoverflow.com/questions/18090285/using-post...
Przykład zakłada, że rank jest w podzapytaniu, wtedy wyfiltrowanie w zapytaniu nadrzędnym zadziała. Można też spróbować dodać OVER z całym bałaganem do where, albo też spróbować z having, które jest "odpalane" na przygotowanym wyniku.
Rafał Mieszkowski

Rafał Mieszkowski Student, Wojskowa
Akademia Techniczna

Temat: zapytanie do archiwum

ok poprawiłem kod i potrzebne dane zostały odfiltrowane

konto usunięte

Temat: zapytanie do archiwum

Rafał M.:
ok poprawiłem kod i potrzebne dane zostały odfiltrowane

Trochę strach prosić o przykładowe zapytanie... bo może się okazać, że jakieś limity na post przekroczymy :D
No, ale i tak mnie ciekawi :)

Następna dyskusja:

Zapytanie




Wyślij zaproszenie do