W bazie danych transakcji obejmującej 1000 podmiotów w ciągu 18 miesięcy chciałbym uruchomić zapytanie w celu grupowania każdego możliwego 30-dniowego okresu entity_id
z sumą ich kwot transakcji i COUNT ich transakcji w tym 30-dniowym okresie, oraz zwrócić dane w sposób, który mogę następnie wykonać zapytanie. Po wielu testach ten kod osiąga wiele z tego, czego chcę:
SELECT id, trans_ref_no, amount, trans_date, entity_id,
SUM(amount) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_total,
COUNT(id) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_count
FROM transactiondb;
I użyję w większym zapytaniu o strukturze podobnej do:
SELECT * FROM (
SELECT id, trans_ref_no, amount, trans_date, entity_id,
SUM(amount) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_total,
COUNT(id) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_count
FROM transactiondb ) q
WHERE trans_count >= 4
AND trans_total >= 50000;
Przypadek, którego to zapytanie nie obejmuje, ma miejsce, gdy transakcje liczą się przez wiele miesięcy, ale nadal występują w odstępie 30 dni od siebie. Czy tego typu zapytania są możliwe w Postgres? Jeśli tak, z zadowoleniem przyjmuję wszelkie uwagi. Wiele innych tematów omawia „ uruchomione ” agregaty, a nie ciągłe .
Aktualizacja
CREATE TABLE
Skrypt:
CREATE TABLE transactiondb (
id integer NOT NULL,
trans_ref_no character varying(255),
amount numeric(18,2),
trans_date date,
entity_id integer
);
Przykładowe dane można znaleźć tutaj . Korzystam z PostgreSQL 9.1.16.
Wyjście idealny obejmowałyby SUM(amount)
i COUNT()
wszystkich transakcji ponad toczenia 30-dniowego okresu. Zobacz ten obraz, na przykład:
Podświetlenie zielonej daty wskazuje, co obejmuje moje zapytanie. Żółte podświetlanie wierszy wskazuje rekordy, które chciałbym stać się częścią zestawu.
Poprzednie czytanie:
entity_id
w 30-dniowym oknie, zaczynając od każdej faktycznej transakcji. Czy może istnieć wiele transakcji dla tego samego (trans_date, entity_id)
lub czy ta kombinacja jest zdefiniowana jako unikalna? Twoja definicja tabeli nie ma UNIQUE
ograniczenia lub PK, ale wydaje się, że brakuje ograniczeń ...
id
klucza podstawowego. Może istnieć wiele transakcji na jednostkę na dzień.
every possible 30-day period by entity_id
ciebie znaczy termin może rozpocząć każdy dzień, więc 365 możliwych okresów w A (non-przestępnym) roku? A może chcesz traktować dni z faktyczną transakcją jako początek każdego okresu indywidualnieentity_id
? Tak czy inaczej, proszę podać definicję tabeli, wersję Postgres, niektóre przykładowe dane i oczekiwany wynik dla próbki.