Как «отфильтровать» записи в таблице Hive? - PullRequest
1 голос
/ 24 мая 2019

Представьте себе таблицу с идентификатором, статусом и измененной датой. Один идентификатор может иметь более одной записи в таблице. Мне нужно вывести только эту строку для каждого идентификатора, который имеет текущий статус вместе с измененной датой, когда этот статус изменился с более старого на текущий.

id            status          modified_date,
--------------------------------------------
1               T             1-Jan,
1               T             2-Jan,
1               F             3-Jan,
1               F             4-Jan,
1               T             5-Jan,
1               T             6-Jan,
2               F             18-Feb,
2               F             20-Feb,
2               T             21-Feb,
3               F             1-Mar,
3               F             1-Mar,
3               F             2-Mar,

Со всем, что я уже сделал, я не могу зафиксировать второе изменение для человека 1 с F на T 5 января.

Итак, я ожидаю результатов:

id            status          modified_date,
--------------------------------------------
1               T             5-Jan,
2               T             21-Feb,
3               F             1-Mar,

1 Ответ

1 голос
/ 24 мая 2019

Используя аналитическую функцию lag (), вы можете обратиться к предыдущей строке, чтобы вычислить флаг status_changed. Затем используйте row_number, чтобы пометить последние измененные статусы строки 1 и отфильтровать их. Смотрите комментарии в коде:

with your_data as (--replace with your table
select stack(12,
1,'T','1-Jan',
1,'T','2-Jan',
1,'F','3-Jan',
1,'F','4-Jan',
1,'T','5-Jan',
1,'T','6-Jan',
2,'F','18-Feb',
2,'F','20-Feb',
2,'T','21-Feb',
3,'F','1-Mar',
3,'F','1-Mar',
3,'F','2-Mar') as (id,status,modified_date)
)
select id,status,modified_date
from
(
select id,status,modified_date,status_changed_flag,
       row_number() over(partition by id, status_changed_flag order by modified_date desc) rn  
 from 
(
select t.*, 
       --lag(status) over(partition by id order by modified_date) prev_status,
       NVL((lag(status) over(partition by id order by modified_date)!=status), true) status_changed_flag
  from your_data t
)s
)s where status_changed_flag and rn=1
order by id --remove ordering if not necessary
;

Результат:

OK
id   status   modified_date
1       T       5-Jan
2       T       21-Feb
3       F       1-Mar
Time taken: 178.643 seconds, Fetched: 3 row(s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...