sql查找以下会话-与交叉连接不同的逻辑

kb5ga3dv  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(269)

我有一组存储两种会话的数据。这是移动数据使用与wifi数据使用的对比。

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

我已经到了自己加入表的程度,这样做了一个id是>比wifi id,但我相信如果这是完美的解决方案。为了更好的表现,你能在一段时间内做到这一点吗?

select a.id, b.id
from 
table a
join table b
where a.id > min(b.id)
zynd9foi

zynd9foi1#

这里有一个使用窗口功能的选项:你可以用一个窗口min获得下一个wifi会话;诀窍是按降序排列帧 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
jei2mxaa

jei2mxaa2#

您可以使用窗口函数——具体来说,是一个累积最小值:

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

相关问题