У меня есть набор данных, в котором хранятся два типа сеансов. Это использование мобильных данных по сравнению с использованием данных Wi-Fi.
ID Session_Type
1 Cell
2 WiFi
3 Cell
4 Cell
5 WiFi
.
.
.
.
1000 Cell
1001 WiFi
Желаемые результаты
Cell_ID. Next_WiFi_sess_id
1 2
3 5
4 5
.
.
1000 1001
Я дошел до того, что присоединился к таблице сам по себе и сделал так, чтобы идентификатор был > чем идентификатор Wi-Fi, но я уверен, что это идеальное решение. Можете ли вы сделать это в лаге для лучшей производительности?
select a.id, b.id
from
table a
join table b
where a.id > min(b.id)
Вы можете использовать оконные функции, в частности, совокупный минимум:
select t.*
from (select t.*,
min(case when session_type = 'WiFi' then id end) over (order by id rows between current row and unbounded following) as next_wifi_id
from t
) t
where session_type = 'Cell';
@эпв . . . На самом деле, вы можете проверить время. Это было более чем за 2 минуты до другого ответа. Обычно я бы не рассматривал скрипку для Hive. Он сильно отличается от других баз данных.
Вот один из вариантов, в котором используются оконные функции: вы можете получить следующий сеанс WiFi с окном min; хитрость в том, чтобы упорядочить кадр по убыванию id
:
select id, next_wifi_id
from (
select t.*,
min(case when session_type = 'WiFi' then id end) over(order by id desc) next_wifi_id
from mytable t
) t
where session_type = 'Cell'
Демонстрация на DB Fiddle - это Postgres, но в Hive поведение такое же.
id | next_wifi_id -: | -----------: 1 | 2 3 | 5 4 | 5
Спасибо за скрипку! Это действительно помогло мне разбить его на части, чтобы понять работу с окнами.
Спасибо, Гордон, за то, что всегда помогаете, это было полезно всего за несколько минут :(