Расширить набор результатов по значениям массива - PullRequest
0 голосов
/ 16 апреля 2019

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

Это текущий запрос:

select
  job_id,
  week,
  count(*),
  sum(count(*)) over (partition by job_id)
from candidates
group by job_id, week

Текущий результат :

 job_id | week | count | sum 
--------+------+-------+------
   3258 |    1 |    21 |  23 
   3258 |    2 |     2 |  23 
   3259 |    1 |     1 |   4 
   3259 |    4 |     1 |   4 

Но в идеале я хочу расширить диапазон за 4 недели:

Желаемый результат

 job_id | week | count | sum 
--------+------+-------+-----
   3258 |    1 |    21 |  23 
   3258 |    2 |     2 |  23 
   3258 |    3 |     0 |  23 # added row with 0 count
   3258 |    4 |     0 |  23 # added row with 0 count
   3259 |    1 |     1 |   4 
   3259 |    2 |     0 |   4 # added row with 0 count
   3259 |    3 |     0 |   4 # added row with 0 count
   3259 |    4 |     1 |   4 

Использование LEFT JOIN не возвращает желаемого результата, как вы можете видеть в этой скрипте SQL

Схема (PostgreSQL v9.6)

CREATE TABLE candidates(
   job_id integer,
   week integer,
   count1 integer,
   sum1 integer
);

INSERT INTO candidates(job_id, week, count1, sum1) VALUES (3984, 1, 13, 26);
INSERT INTO candidates(job_id, week, count1, sum1) VALUES (3984, 2, 13, 26);

INSERT INTO candidates(job_id, week, count1, sum1) VALUES (3985, 1, 42, 46);
INSERT INTO candidates(job_id, week, count1, sum1) VALUES (3985, 4, 3, 46);

Запрос № 1

select
  c.job_id,
  weeks.week_nr as week,
  c.count1,
  c.sum1
from generate_series(1,4) as weeks(week_nr)
left join candidates c on c.week = weeks.week_nr 
order by c.job_id, week;
| job_id | week | count | sum |
| ------ | ---- | ----- | --- |
| 3984   | 1    | 1     | 2   |
| 3984   | 2    | 1     | 2   |
| 3985   | 1    | 1     | 2   |
| 3985   | 4    | 1     | 2   |
| null   | 3    | null  | null|

1 Ответ

0 голосов
/ 16 апреля 2019

В postgresql мы можем получить используемые значения диапазона generate_series () (или) , где условие

 select job_id,week,count(*),sum(count(*)) over (partition by job_id)
 from generate_series(1,4) as weeks(week_nr)
 left join candidates c on c.week = weeks.week_nr 
 group by job_id, week order by job_id,week;

                       (or)

 select job_id,week,count(*),sum(count(*)) over (partition by job_id)
 from candidates where week>=1 and week<=4
 group by job_id, week;
...