В базе данных транзакций, охватывающей тысячи субъектов в течение 18 месяцев, я хотел бы выполнить запрос для группировки каждого возможного 30-дневного периода по entity_id
сумме их сумм транзакций и количеству их транзакций за этот 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
ограничения или ограничения PK, но ограничения, по-видимому, отсутствуют ...
id
первичный ключ. Может быть несколько транзакций на объект в день.
every possible 30-day period by entity_id
вам означает , что период может начать любой день, так что 365 возможных периодов в (не високосный) год? Или вы хотите рассматривать дни с фактической транзакцией как начало периода отдельно для любогоentity_id
? В любом случае, пожалуйста, укажите определение таблицы, версию Postgres, некоторые примеры данных и ожидаемый результат для образца.