Заявление об ограничении ответственности: это не отвечает на ваш вопрос, но это слишком длинный для комментария.
Вам необходимо исправить дизайн этой таблицы. Вместо того, чтобы хранить даты в столбцах, вы должны размещать каждую дату в отдельной строке .
У вашего текущего дизайна есть множество недостатков:
очень простые запросы чрезвычайно сложны: фильтрация по датам, агрегирование ... Все эти операции требуют динамического c SQL, что значительно усложняет
добавление или удаление новых date требует изменения структуры таблицы
хранилище тратится впустую для строк, в которых заполнены не все столбцы
Вместо этого рассмотрите этот простой дизайн, с одной таблицей, в которой хранятся основные данные каждого item_sku
, и дочерней таблицей
create table myskus (
item_sku int primary key,
name text,
cat_level_3_name text
);
create table myvalues (
item_sku int references myskus(item_sku),
date_sku date,
value_sku text,
primary key (item_sku, date_sku)
);
Теперь ваш исходный вопрос легко решить:
select v.*, s.name, s.cat_level_3_name
from myskus s
inner join myvalues v on v.item_sku = s.item_sku
where
v.date_sku >= date_trunc('month', now())
and v.date_sku < date_trunc('month', now()) + interval '3 month'