SQL Найти следующий сеанс - логика отличается от перекрестного соединения

У меня есть набор данных, в котором хранятся два типа сеансов. Это использование мобильных данных по сравнению с использованием данных 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)
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать оконные функции, в частности, совокупный минимум:

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';

Спасибо, Гордон, за то, что всегда помогаете, это было полезно всего за несколько минут :(

enavuio 15.12.2020 06:13

@эпв . . . На самом деле, вы можете проверить время. Это было более чем за 2 минуты до другого ответа. Обычно я бы не рассматривал скрипку для Hive. Он сильно отличается от других баз данных.

Gordon Linoff 15.12.2020 13:07

Вот один из вариантов, в котором используются оконные функции: вы можете получить следующий сеанс 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

Спасибо за скрипку! Это действительно помогло мне разбить его на части, чтобы понять работу с окнами.

enavuio 15.12.2020 06:13

Другие вопросы по теме