#postgresql
#postgresql
Вопрос:
ПРОБЛЕМА: В записях ниже отсутствуют несколько месяцев. Необходимо отфильтровать целые годы с неполными месяцами.
DATE VALUE
2018-01-01 123
2018-02-01 123
2018-03-01 123
2018-04-01 123
2018-05-01 123
2018-06-01 123
2018-07-01 123
2018-08-01 123
2018-09-01 123
2018-10-01 123
2018-11-01 123
2018-12-01 123
2019-01-01 123 // Remove.
Исследования:
CREATE TABLE new_table AS
SELECT * FROM my_table
WHERE ...
ВОПРОС:
How to get:
DATE VALUE
2018-01-01 123
2018-02-01 123
2018-03-01 123
2018-04-01 123
2018-05-01 123
2018-06-01 123
2018-07-01 123
2018-08-01 123
2018-09-01 123
2018-10-01 123
2018-11-01 123
2018-12-01 123
Ответ №1:
Вы можете использовать инструкцию group by, чтобы найти те, в которых присутствуют все месяцы:
select to_char(date, 'yyyy')
from the_table
group by to_char(date, 'yyyy')
having count(distinct to_char(date, 'mm')) = 12;
Это можно использовать, чтобы получить только те, которые вас интересуют:
select *
from the_table
where to_char(date, 'yyyy') in (select to_char(date, 'yyyy')
from the_table
group by to_char(date, 'yyyy')
having count(distinct to_char(date, 'mm')) = 12);
В качестве альтернативы используйте extract(year from ..)
select extract(year from date)
from the_table
group by extract(year from date)
having count(*) = 12;
Онлайн-пример:https://rextester.com/LKF6618
Комментарии:
1. Если в месяц может быть более одного значения (тестовые данные и текст не указывают), то
count(*) = 12
следует изменить наcount(distinct to_char(date,'mm')) = 12
2. Если вы считаете, что моя точка зрения верна, вам следует заменить два
count(distinct to_char(date, 'yyyy'))
наcount(distinct to_char(date, 'mm'))
в вашем ответе 😉