Неполный год фильтрации PostgreSQL

#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')) в вашем ответе 😉