Самостоятельная таблица присоединения к данным предыдущего месяца для добавления отсутствующих записей - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь объединить таблицу Impala с данными предыдущего месяца, чтобы проверить пропущенные записи в текущем месяце.У меня есть записи сотрудников в исходной таблице.Если сотрудник не присутствует в текущем месяце, но был там в предыдущем месяце, необходимо пометить этого сотрудника как «Прекращено»

Пытался выполнить внешнее левое соединение с условием даты и именем сотрудника, но он не возвращаетсяотсутствующая запись.

Текущий месяц сотрудника равен сотруднику предыдущего месяца

Текущий отчетный месяц равен предыдущему отчетному месяцу

Input Data:

+---------+---------+-----------+----------------+
|employee | branch  | hire_date | reporting_month|
+---------+---------+-----------+----------------+
| James   | EE      | 20170101  |   20190131     |
+---------+---------+-----------+----------------+
| Judy    | GIP     | 20181014  |   20190131     |
+---------+---------+-----------+----------------+
| James   | EE      | 20170101  |   20190228     |
+---------+---------+-----------+----------------+
| Judy    | GIP     | 20181014  |   20190228     |
+---------+---------+-----------+----------------+
| James   | EE      | 20170101  |   20190331     |
+---------+---------+-----------+----------------+
| Judy    | GIP     | 20181014  |   20190331     |
+---------+---------+-----------+----------------+
| James   | EE      | 20170101  |   20190430     |
+---------+---------+-----------+----------------+
| Max     | EEI     | 20170201  |   20190430     |
+---------+---------+-----------+----------------+

Предположим, текущий отчетный месяц равен 20190430, а сотрудник Джуди - нет.присутствует, тогда необходимо добавить запись для Джуди с термином флаг как «Завершено»

Expected Output:

+---------+---------+-----------+----------------+-----------+
|employee | branch  | hire_date | reporting_month| Term_flag |
+---------+---------+-----------+----------------+-----------+
| James   | EE      | 20170101  |   20190131     | NULL      |
+---------+---------+-----------+----------------+-----------+
| Judy    | GIP     | 20181014  |   20190131     | NULL      |
+---------+---------+-----------+----------------+-----------+
| James   | EE      | 20170101  |   20190228     | NULL      |
+---------+---------+-----------+----------------+-----------+
| Judy    | GIP     | 20181014  |   20190228     | NULL      |
+---------+---------+-----------+----------------+-----------+
| James   | EE      | 20170101  |   20190331     | NULL      |
+---------+---------+-----------+----------------+-----------+
| Judy    | GIP     | 20181014  |   20190331     | NULL      |
+---------+---------+-----------+----------------+-----------+
| James   | EE      | 20170101  |   20190430     | NULL      |
+---------+---------+-----------+----------------+-----------+
| Judy    | GIP     | 20181014  |   20190430     |Terminated | 
+---------+---------+-----------+----------------+-----------+
| Max     | EEI     | 20170201  |   20190430     | NULL      |
+---------+---------+-----------+----------------+-----------+

1 Ответ

0 голосов
/ 25 сентября 2019

Я не уверен, откуда взялась волшебная дата для 20190430.Основная идея: union all выглядит следующим образом:

select employee, branch, hire_date, reporting_month, null as term_flag
from input
union all
select employee, branch, hire_date, 20190430 as reporting_month, 'terminated'
from (select i.*,
             row_number() over (order by reporting_month desc) as seqnum
      from input i
     ) i
where seqnum = 1 and
      months_add(trunc(reporting_month, 'MON') , 1) < '2019-04-01';

Арифметика месяца может быть немного хитрой, потому что ваша дата - последний день месяца, а не первый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...