SQL windows 函数 LEAD/LAG 但只考虑某些值?

Posted

技术标签:

【中文标题】SQL windows 函数 LEAD/LAG 但只考虑某些值?【英文标题】:SQL windows functions LEAD/LAG but only taking certain values into account? 【发布时间】:2021-05-23 15:52:47 【问题描述】:

假设您有一个应用,并且想知道每次安装是否可以归因于新用户或回访用户。 因此,您要检查每个安装的 ID 是否有登录或注册事件,以较早者为准。 你会如何从左桌走到右桌? 如果我可以说,使用窗口函数会很容易:

 LAG(event,1) OVER (PARTITION BY id ORDER by event_timestamp)   

+但跳过“安装”事件,跳过它们

【问题讨论】:

用您正在使用的数据库标记您的问题。 添加了 presto,谢谢 【参考方案1】:

你会使用lead(ignore nulls):

select t.*
from (select t.*,
             lead(case when event <> 'install' then event end ignore nulls) over (partition by id order by timestamp) as next_event
      from t
     ) t
where event = 'install';

ignore nulls 选项是标准 SQL。但是,并非所有数据库都支持它。此类数据库中通常还有其他选项,但没有数据库标记,建议使用标准 SQL。

【讨论】:

@Chris。 . . Presto 应该支持ignore nulls 选项。 你能举个例子吗?我查了一下,确实不明白。因此,在上面的示例中,我希望显示所有 ID=234,我不想仅仅因为下一个事件是“安装”而删除前 2 个实例。感谢您的帮助! @Chris。 . .下一个事件与过滤无关。 @ Gordon Linoff prestodb.io/docs/current/functions/window.html 领导(事件 '安装' 然后事件结束时忽略 NULLS 情况)?不好意思,presto官方文档没有例子,我也没见过这个 @Chris。 . .查看“值”函数或只搜索ignore nulls

以上是关于SQL windows 函数 LEAD/LAG 但只考虑某些值?的主要内容,如果未能解决你的问题,请参考以下文章

带有 where 子句的窗口函数(LEAD/LAG)?

通过 LEAD/LAG 或递归 CTE 更新?

具有 LEAD/LAG 功能的行到列

Oracle SQL 组问题

Snowflake SQL 错误 - 函数“-”的参数类型无效:(TIMESTAMP_NTZ(9), TIMESTAMP_NTZ(9))

R语言dplyr包对数据进行超前或者之后处理(leadlag)实战