Всем привет
Есть таблица с данными о подписках, у записей есть поле "подписка от" и "подписка до", написал запрос, который выдает подписки на текущий месяц, причем по таким условиям:
- подписка от <= конец текущего месяца
- подписка до >= начало текущего месяца
то есть когда период подписки "цепляет" текущий месяц (см. приложенную схему)
Теперь мне нужна выгрузка за предыдущий год так же разбивка по месяцам. Я та понял тут надо использовать WITH RECURSIVE, но пока не удается написать правильный запрос. Пытался написать что-то типа такого
WITH RECURSIVE r AS (
-- стартовая часть рекурсии (т.н. "anchor")
SELECT
1 AS i,
current_date AS days
UNION
-- рекурсивная часть
SELECT
i+1 AS i,
current_date - interval '1 month' * i as days
FROM r
WHERE i < 12
)
SELECT * FROM r;
(не смотрите, что нет условий по сравниванию с началом и концом месяца, я просто пробовал шагать 'по месяцам', когда научусь в принципе несложно будет в сравнение в условие запихнуть), но выходят ошибки, типа
ERROR: recursive query "r" column 2 has type date in non-recursive term but type timestamp without time zone overall
LINE 5: current_date AS days
^
HINT: Cast the output of the non-recursive term to the correct type.
Не понимаю.
И сразу вдогонку вопросы:
- в якорной части мы же пишем только скажем так начальные счетчики, а в рекурсивной пишем запрос, чтоб условия на основе этих счетчиков соблюдалось, или нужно там прописать первую итерацию, и последующие будут объединяться с тем, что в якорной получилось?
- Можно сделать так, чтобы значения счетчиков не отображалось (не присутствовало в SELECT)?