У базі даних про трансакції, що охоплюють тисячі організацій протягом 18 місяців, я хотів би запустити запит, щоб згрупувати кожен можливий 30-денний період за entity_id
допомогою СУМ їх суми транзакцій та COUNT їхніх транзакцій за той 30-денний період, і повернути дані таким чином, щоб потім я міг запитати. Після багато тестування цей код виконує багато чого з того, що я хочу:
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;
І я буду використовувати в більшому запиті структуровану щось на кшталт:
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;
У випадку, коли цей запит не охоплюється, це коли кількість підрахунків транзакцій триватиме кілька місяців, але все одно залишається протягом 30 днів один від одного. Чи можливий такий тип запиту за допомогою Postgres? Якщо так, я вітаю будь-які дані. Багато інших тем обговорюють " запуск " агрегатів, а не прокатки .
Оновлення
CREATE TABLE
скрипт:
CREATE TABLE transactiondb (
id integer NOT NULL,
trans_ref_no character varying(255),
amount numeric(18,2),
trans_date date,
entity_id integer
);
Зразкові дані можна знайти тут . Я запускаю PostgreSQL 9.1.16.
Ідеальний вихід включатиме SUM(amount)
і COUNT()
всі транзакції протягом 30-денного періоду. Дивіться це зображення, наприклад:
Зелене виділення дати вказує, що включено в мій запит. Виділення жовтого рядка вказує на записи, які я хотів би стати частиною набору.
Попереднє читання:
entity_id
30 днів, починаючи з кожної фактичної транзакції. Чи може бути кілька транзакцій за одну (trans_date, entity_id)
або одна комбінація визначена унікальною? Визначення таблиці не має UNIQUE
обмежень або ПК, але, здається, обмежень немає ...
id
первинний ключ. На день може бути кілька операцій на одну особу.
every possible 30-day period by entity_id
вам означає , що період може почати будь-який день, так що 365 можливих періодів в (невисокосному) рік? Або ви хочете вважати дні з фактичною транзакцією як початок періоду індивідуально для будь-якогоentity_id
? У будь-якому випадку вкажіть визначення таблиці, версію Postgres, деякі приклади даних та очікуваний результат для вибірки.