【问题标题】:Extract records based on a condition根据条件提取记录
【发布时间】:2021-09-23 22:27:48
【问题描述】:

我只想提取 OrderofEvents 1 后跟 2 的行。例如,数据按 EventTime 排序,并且每当 EventName 更改时 OrderofEvents 更改。每当OrderofEvents 更改时,我想提取该行和上一行。下面是输入数据的样子-

EventName             EventTime       OrderofEvents
AddedtoCart       2020-02-22 11:40         1 
AddedtoCart       2020-02-23 12:40         1   
AddedtoCart       2020-02-24 01:40         1   
Billed            2020-02-24 01:42         2   
AddedtoCart       2020-03-01 02:40         1   
AddedtoCart       2020-03-02 03:40         1   
AddedtoCart       2020-03-02 04:40         1   
AddedtoCart       2020-03-03 05:40         1    

输出应该看起来像 -

EventName             EventTime       OrderofEvents 
AddedtoCart       2020-02-24 01:40         1   
Billed            2020-02-24 01:42         2      

【问题讨论】:

    标签: sql snowflake-schema


    【解决方案1】:

    您可以使用lead()lag()

    select t.*
    from (select t.*,
                 lead(OrderofEvents) over (order by eventtime) as next_ooe,
                 lag(OrderofEvents) over (order by eventtime) as prev_ooe
          from t
         ) t
    where (OrderofEvents = 1 and next_ooe = 2) or
          (OrderofEvents = 2 and prev_ooe = 1) ;
    

    这会返回两个事件。

    【讨论】:

    • ...所有EventTimes 都不同,因此分区只会导致额外的工作(然后不返回任何结果)
    • @Clockwork-Muse 。 . .哈哈。那甚至不应该奏效。应该是order bylag()lead() 应该需要 order by
    • 还是不行,因为没有OrderOfEvents条目是0...
    • (并且您不需要LAG 或特定值检查,因为您可以与当前条目进行比较以进行更改)
    【解决方案2】:

    使用lead函数

         Select * from table
           where 
           OrderofEvents<> lead(OrderofEvents) over ()
    

    或者如果上面不支持,试试这个

          WITH CTE AS 
        (Select *,lead(OrderofEvents) over (order by (SELECT NULL) 
           )as lg
           from table)
           Select * from CTE where
           OrderofEvents<> lg
           
           
    

    【讨论】:

    • 只做OrderofEvents &lt;&gt; lag(OrderofEvents) over()
    • 没错,让 SQL 更短,谢谢!
    • 刚刚注意到一件事,您应该使用lead 而不是lag。如果你使用lag,那么它会给你2, 1,而铅会给你1, 2。默认值也应该是第一个值
    • Order by 可以防止它,但你的观点也是正确的铅可以直接阻止它。在答案中更正
    • 至少在 PostgreSQL 上,此语句的当前版本会生成语法错误“WHERE 子句中不允许使用窗口函数”- 它在什么 RDBMS 上运行?除此之外,如果没有 ORDER BY 子句,该语句将返回非确定性(实际上是随机的)结果。
    猜你喜欢
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多