SQL查找以下会话 - 与交叉连接不同的逻辑
Posted
技术标签:
【中文标题】SQL查找以下会话 - 与交叉连接不同的逻辑【英文标题】:SQL Find following session - different logic than cross join 【发布时间】:2020-12-14 23:10:07 【问题描述】:我有一组数据存储两种类型的会话。这是移动数据使用量与 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 的操作,但我确信这是否是完美的解决方案。您可以在 Lag 中执行此操作以获得更好的性能吗?
select a.id, b.id
from
table a
join table b
where a.id > min(b.id)
【问题讨论】:
【参考方案1】:您可以使用窗口函数——特别是累积最小值:
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';
【讨论】:
感谢 Gordan 一直以来的帮助,这很有帮助 :( @epv 。 . .实际上,您可以查看时间。这比另一个答案早于 2 分钟。我通常不会考虑为 Hive 提供小提琴。它与其他数据库完全不同。【参考方案2】:这是一个使用窗口函数的选项:您可以使用窗口 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'
Demo on DB Fiddle - 这是 Postgres,但在 Hive 中的行为是相同的。
编号 | next_wifi_id -: | ------------: 1 | 2 3 | 5 4 | 5【讨论】:
感谢您的提琴!它真的帮助我把它分开,理解窗口。以上是关于SQL查找以下会话 - 与交叉连接不同的逻辑的主要内容,如果未能解决你的问题,请参考以下文章