Я выполняю несколько запросов на создание отчетов и хочу расширить результаты для каждой записи в определенном наборе за 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|