zoukankan      html  css  js  c++  java
  • 分析函数之Lead()、Lag()

    一、功能介绍

    Lag 分析函数可以在同一次查询中取出同一字段的前N行的数据作为独立的列
    Lead 分析函数可以在同一次查询中取出同一字段的后N行的数据作为独立的列

    二、Lead(),Lag()函数语法

    lag(exp_str,offset,defval) over(partion by ..order by …)
    
    lead(exp_str,offset,defval) over(partion by ..order by …)
    
    • 其中exp_str是字段名

    • Offset是偏移量,即是上1个或上N个的值,假设当前行在表中排在第5行,则offset 为3,则表示我们所要找的数据行就是表中的第2行(即5-3=2)。

    • Defval默认值,当两个函数取上N/下N个值,当在表中从当前行位置向前数N行已经超出了表的范围时,lag()函数将defval这个参数值作为函数的返回值,若没有指定默认值,则返回NULL

    三、Lead()用法案例

    • 数据源
    UserVisits 表:
    +---------+------------+
    | user_id | visit_date |
    +---------+------------+
    | 1       | 2020-11-28 |
    | 1       | 2020-10-20 |
    | 1       | 2020-12-3  |
    | 2       | 2020-10-5  |
    | 2       | 2020-12-9  |
    | 3       | 2020-11-11 |
    +---------+------------+
    
    • 需求

    假设今天的日期是 '2021-1-1' 。
    编写 SQL 语句,对于每个 user_id ,求出每次访问及其下一个访问(若该次访问是最后一次,则为今天)之间最大的空档期天数 window 。
    返回结果表,按用户编号 user_id 排序。
    查询格式如下示例所示:

    结果表:
    +---------+---------------+
    | user_id | biggest_window|
    +---------+---------------+
    | 1       | 39            |
    | 2       | 65            |
    | 3       | 51            |
    +---------+---------------+
    
    • SQL
    select user_id,max(datediff(ld,visit_date)) biggest_window from (
        select user_id,visit_date,
            lead(visit_date,1,'2021-01-01') over(partition by user_id order by visit_date asc) ld
        from UserVisits
    ) t
    group by user_id
    order by user_id 
    
    • 解题说明
    1. 先取当前行,与下一行组成新的临时表,让其根据日期升序排列,最后填充今日的日期
    2. 求出日期差值,分组取出每个用户的最大日期差值
    作者:落花桂
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    http协议学习系列
    git常用命令大全
    git常用命令与常见面试题总结
    MyBatis框架及原理分析
    Mybatis常见面试题总结
    java实现克隆的三种(很最全面)
    java中equals和==之间的区别?clone方法的作用,及其为什么要使用clone方法?如何使用clone复制对象?以及深克隆浅克隆
    ThreadLocal的简单使用及实现的原理
    Java 最常见的 208 道面试题
    TCP流量控制
  • 原文地址:https://www.cnblogs.com/nthforsth/p/15632505.html
Copyright © 2011-2022 走看看