Итак, чтобы решить эту проблему, мы сначала все год + квартал значений для конкретного идентификатора, а затем мы можем рассчитать количество для каждого год + квартал . Таким образом, решение делится на два этапа следующим образом:
- Создайте набор данных, чтобы получить все значения года + квартала для идентификатора.
- CROSS СОЕДИНИТЕ его с исходными данными, чтобы получить всерезультат.
1. СОЗДАНИЕ БАЗЫ ДАННЫХ:
Чтобы создать набор данных, необходимо выполнить следующие шаги:
- Получить уникальный идентификатор, комбинацию года
- Преобразовать данные года в данные года + квартала.
- Отделить запись массива.
Получить уникальный идентификатор, комбинацию лет:
SELECT ID, ARRAY[substr(Qtr, 1, 4)] AS year from table_name
GROUP BY ID, ARRAY[substr(Qtr, 1, 4)]
Преобразовать данные года вданные за год и квартал:
WITH dataset AS (
SELECT ID, ARRAY[substr(Qtr, 1, 4)] AS year from table_name
GROUP BY ID, ARRAY[substr(Qtr, 1, 4)]
)
select ID, transform(year, x->x||'Q1') || transform(year, x->x||'Q2') || transform(year, x->x||'Q3') ||
transform(year, x->x||'Q4')
AS year from dataset
Отделить его от массива:
WITH dataset AS (
WITH inner_dataset AS (
SELECT ID, ARRAY[substr(Qtr, 1, 4)] AS year from table_name
GROUP BY ID, ARRAY[substr(Qtr, 1, 4)]
)
select ID, transform(year, x->x||'Q1') || transform(year, x->x||'Q2') ||
transform(year, x->x||'Q3') || transform(year, x->x||'Q4')
AS year from inner_dataset
)
SELECT ID,yr from dataset
CROSS JOIN UNNEST(year) AS t(yr)
Результатом этого запроса будет ряд строк ID, год + квартал со всеми четвертями для каждого идентификатора. Теперь следующим шагом будет преобразование его в окончательный набор данных, а затем СОЕДИНЕНИЕ этих данных с исходной таблицей.
2. CROSS СОЕДИНИТЕ его с исходными данными, чтобы получить весь результат.
SELECT table_name.ID,final_dataset.yr,coalesce(table_name.Count,0)
FROM table_name
CROSS JOIN final_dataset
ON table_name.ID = final_dataset.ID AND table_name.Qtr = final_dataset.yr
ORDER BY table_name.ID,final_dataset.yr
coalesce () используется для преобразования значений NULL в 0.
FINAL QUERY:
WITH final_dataset AS (
WITH dataset AS (
WITH inner_dataset AS (
SELECT ID, ARRAY[substr(Qtr, 1, 4)] AS year from table_name
GROUP BY ID, ARRAY[substr(Qtr, 1, 4)]
)
select ID, transform(year, x->x||'Q1') || transform(year, x->x||'Q2') ||
transform(year, x->x||'Q3') || transform(year, x->x||'Q4')
AS year from inner_dataset
)
SELECT ID,yr from dataset
CROSS JOIN UNNEST(year) AS t(yr)
)
SELECT table_name.ID,final_dataset.yr,coalesce(table_name.Count,0)
FROM table_name
CROSS JOIN final_dataset
ON table_name.ID = final_dataset.ID AND table_name.Qtr = final_dataset.yr
ORDER BY table_name.ID,final_dataset.yr