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查找以下会话 - 与交叉连接不同的逻辑的主要内容,如果未能解决你的问题,请参考以下文章

MS SQL 交叉连接性能评估

SQL Server-交叉联接内部联接基础回顾

SQL Server外连接内连接交叉连接

在 SQL 中查找排名最高的相交行

JPQL 到 SQL 使用 Hibernate 更新查询交叉连接问题

Sklearn 交叉验证产生与手动执行不同的结果