PostgreSQL - Как избежать слишком большого количества СОЕДИНЕНИЙ? - PullRequest
1 голос
/ 07 апреля 2020

У нас есть company_employee_count таблица отслеживания сотрудников по кварталам. В таблице есть столбец для подсчета предыдущего квартала, чтобы быстро определить кварталы, в которых количество сотрудников увеличилось или уменьшилось по сравнению с предыдущим кварталом. Теперь нам нужно написать запрос SQL, чтобы найти компании, которые последовательно увеличивали количество сотрудников за последние N кварталов. то есть, если мы пройдем четыре квартала кварталов 2019_Q1, 2019_Q2, 2019_Q3, 2019_Q4, мы хотим получить компании, у которых employee_count во всех четырех кварталах и текущий счетчик квартала больше, чем в предыдущем квартале.

    TABLE company_employee_count{
    company_id
    employee_count
    quarter (Stored as 2019_Q1, 2019_Q2)
    prev_quarter_employee_count
    }

Мы используете postgresql. В настоящее время я использую такой запрос, в котором есть данные JOIN для данных за каждый квартал.

select * from
(select employee_count,company_id from company_employee_count where quarter='2019_Q4') as q4_19
inner join
(select employee_count,company_id from company_employee_count where quarter='2019_Q3') as q3_19
on q4_19.company_id=q3_19.company_id
inner join 
(select employee_count,company_id from company_employee_count where quarter='2019_Q2') as q2_19
on q2_19.company_id=q3_19.company_id
inner join
(select employee_count,company_id from company_employee_count where quarter='2019_Q1') as q1_19
on q2_19.company_id=q1_19.company_id
where 
q4_19.employee_count > q3_19.employee_count and 
q3_19.employee_count > q2_19.employee_count and
q2_19.employee_count > q1_19.employee_count

Я хочу не подключаться к квартальным данным и иметь возможность каким-либо образом использовать prev_quarter_employee_count.

Ценить любые помощь / предложения.

1 Ответ

1 голос
/ 07 апреля 2020

Использовать условное агрегирование и подзапрос:

select c.*
from (select company_id,,
             max(employee_count) filter (where quarter = '2019_Q4') as q4_19,
             max(employee_count) filter (where quarter = '2019_Q3') as q3_19,
             max(employee_count) filter (where quarter = '2019_Q2') as q2_19,
             max(employee_count) filter (where quarter = '2019_Q1') as q1_19
      from company_employee_count
      where quarter in ('2019-Q1', '2019-Q2', '2019-Q3', '2019-Q4')
      group by company_id
     ) c
where q4_19 > q3_19 and q3_19 > q2_19 and q2_19 > q1_19
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...