Найти новые записи за каждый из прошедших n месяцев в PostgreSQL - PullRequest
1 голос
/ 21 июня 2011

У меня есть таблица рекордов с созданной датой в них. Я хотел бы вернуть новые записи за каждый из последних 6 календарных месяцев, включая частичные в этом месяце. Я хорошо знаю SQL Server, но не так хорошо знаком с PostgreSQL.

Мне удалось получить данные за скользящие месяцы по этому запросу:

select 
COUNT(ID) as Total,
COUNT(CASE WHEN createddate between (now() - '1 month'::interval)::timestamp AND now() THEN AG.ID END) as ThisMonth,
COUNT(CASE WHEN createddate between (now() - '2 month'::interval)::timestamp AND (now() - '1 month'::interval)::timestamp THEN AG.ID END) as LastMonth,
COUNT(CASE WHEN createddate between (now() - '3 month'::interval)::timestamp AND (now() - '2 month'::interval)::timestamp THEN AG.ID END) as PrevMonth,
COUNT(CASE WHEN createddate between (now() - '4 month'::interval)::timestamp AND (now() - '3 month'::interval)::timestamp THEN AG.ID END) as PrevMonth2,
COUNT(CASE WHEN createddate between (now() - '5 month'::interval)::timestamp AND (now() - '4 month'::interval)::timestamp THEN AG.ID END) as PrevMonth3,
COUNT(CASE WHEN createddate between (now() - '6 month'::interval)::timestamp AND (now() - '5 month'::interval)::timestamp THEN AG.ID END) as PrevMonth4
FROM a_group AG

Но 6/21 вернутся данные 5/22-6 / 21, 4 / 22-5 / 21 и т. Д.
Я хотел бы, чтобы данные складывались следующим образом: 6 / 1-6 / 21 (частичный текущий месяц), 5 / 1-5 / 31 и т. Д.

Есть предложения? Я также подозреваю, что мог бы сделать это в цикле, но еще недостаточно знаком с синтаксисом. На данный момент я тестирую это из PostgreSQL Maestro для резервного файла.

Спасибо.

1 Ответ

5 голосов
/ 21 июня 2011

Я думаю, что функция date_trunc может быть вашим другом (см. postgres docs ).Вы бы сделали что-то вроде этого, я думаю:

select 
COUNT(ID) as Total,
COUNT(CASE WHEN createddate between date_trunc('month', now()) AND now() THEN AG.ID END) as ThisMonth,
COUNT(CASE WHEN createddate between date_trunc('month', now()) - interval '1 month' AND date_trunc('month', now()) - interval '1 day' THEN AG.ID END) as LastMonth,

и т.д ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...