Заполните пропущенные строки на основе смешанных дат - PullRequest
1 голос
/ 28 июня 2019

Я выполняю сопоставление в Informatica IICS и пытаюсь заполнить пропущенные строки в моем наборе данных на основе нескольких полей.

Ниже приведен пример таблицы данных. Существует поле ID, поле Week_Start, являющееся начальной датой недели, за которую сообщаются данные, соответствующее поле Week_Number и Year, которое либо определяет данные как принадлежащие предыдущему году, либо текущий год Sales - это количество продаж, сделанных по этому конкретному идентификатору, а Sales_Type - это категория продаж.

Существуют даты, когда конкретный человек не совершал продажу, поэтому строка, соответствующая этим данным, отсутствует. Я хотел бы заполнить эти строки всей связанной информацией, а для поля Sales установить значение 0.

Мои фактические данные имеют 6-недельное окно информации за предыдущий и текущий год для 7 различных типов продаж. Таким образом, я ожидаю, что 6x2x7 = 84 строки на ID. т.е. если у меня есть 100 уникальных идентификаторов, моя итоговая таблица должна содержать 8400 строк.

Таблица с пропущенными строками:

+----+------------+-------------+---------+-------+------------+
| ID | Week_Start | Week_Number |  Year   | Sales | Sales_Type |
+----+------------+-------------+---------+-------+------------+
|  1 | 01/01/2018 |           1 | Prior   |     1 | A          |
|  1 | 01/08/2018 |           2 | Prior   |     3 | A          |
|  1 | 01/15/2018 |           3 | Prior   |     3 | A          |
|  1 | 01/29/2018 |           5 | Prior   |     4 | A          |
|  1 | 01/01/2019 |           1 | Current |     2 | A          |
|  1 | 01/08/2019 |           2 | Current |     4 | A          |
|  1 | 01/15/2019 |           3 | Current |     1 | A          |
|  1 | 01/22/2019 |           4 | Current |     1 | A          |
|  1 | 01/01/2018 |           1 | Prior   |     1 | B          |
|  1 | 01/08/2018 |           2 | Prior   |     3 | B          |
|  1 | 01/15/2018 |           3 | Prior   |     3 | B          |
|  1 | 01/29/2018 |           5 | Prior   |     4 | B          |
|  1 | 01/01/2019 |           1 | Current |     2 | B          |
|  1 | 01/08/2019 |           2 | Current |     4 | B          |
|  1 | 01/15/2019 |           3 | Current |     1 | B          |
|  1 | 01/22/2019 |           4 | Current |     1 | B          |
+----+------------+-------------+---------+-------+------------+

Ожидаемый результат с заполнением пропущенных строк:

+----+------------+-------------+---------+-------+------------+
| ID | Week_Start | Week_Number |  Year   | Sales | Sales_Type |
+----+------------+-------------+---------+-------+------------+
|  1 | 01/01/2018 |           1 | Prior   |     1 | A          |
|  1 | 01/08/2018 |           2 | Prior   |     3 | A          |
|  1 | 01/15/2018 |           3 | Prior   |     3 | A          |
|  1 | 01/22/2018 |           4 | Prior   |     0 | A          |
|  1 | 01/29/2018 |           5 | Prior   |     4 | A          |
|  1 | 01/01/2019 |           1 | Current |     2 | A          |
|  1 | 01/08/2019 |           2 | Current |     4 | A          |
|  1 | 01/15/2019 |           3 | Current |     1 | A          |
|  1 | 01/22/2019 |           4 | Current |     1 | A          |
|  1 | 01/29/2019 |           5 | Current |     0 | A          |
|  1 | 01/01/2018 |           1 | Prior   |     1 | B          |
|  1 | 01/08/2018 |           2 | Prior   |     3 | B          |
|  1 | 01/15/2018 |           3 | Prior   |     3 | B          |
|  1 | 01/22/2018 |           4 | Prior   |     0 | B          |
|  1 | 01/29/2018 |           5 | Prior   |     4 | B          |
|  1 | 01/01/2019 |           1 | Current |     2 | B          |
|  1 | 01/08/2019 |           2 | Current |     4 | B          |
|  1 | 01/15/2019 |           3 | Current |     1 | B          |
|  1 | 01/22/2019 |           4 | Current |     1 | B          |
|  1 | 01/29/2019 |           5 | Current |     0 | B          |
+----+------------+-------------+---------+-------+------------+

Я пытался использовать преобразования в ICS, но ни один из них не достиг того, что я пытаюсь сделать. Мое лучшее предположение о том, как это сделать, заключается в использовании рекурсивного CTE в SQL и использовании сценария SQL для генерации этих пропущенных строк.

Мой вопрос: как мне сделать это на нескольких разделах? Меня интересуют не просто пропущенные даты, это пропущенные даты на два года и несколько разных видов продаж. Это усложняется еще и тем, что столбец Week_Start содержит смешанные данные. Мои первые попытки сделать это закончились генерацией всех строк между датой в 2018 году и данными в 2019 году.

1 Ответ

1 голос
/ 28 июня 2019

Используйте cross join для генерации строк и left join для ввода значений:

select w.week_start, w.week_number, ys.year, ys.sales_type,
       coalesce(t.sales, 0) as sales
from (select distinct week_start, week_number from t) w cross join
     (select distinct year, sales_type from t) ys left join
     t
     on t.week_start = w.week_start and
        t.year = ys.year and
        t.sales_type = ys.sales_type;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...