• SQL面试题练习 —— 波峰波谷


    来源:字节今日头条

    1 题目


    有如下数据,记录每天每只股票的收盘价格,请查出每只股票的波峰和波谷的日期和价格;

    在这里插入图片描述

    波峰定义:股票价格高于前一天和后一天价格时为波峰
    波谷定义:股票价格低于前一天和后一天价格是为波谷

    2 建表语句


    CREATE TABLE t_stock_test (
        ts_code VARCHAR(20) COMMENT '股票代码',
        trade_date VARCHAR(20) COMMENT '交易日期',
        close FLOAT COMMENT '收盘价'
    );
    INSERT INTO `t_stock_test` VALUES 
    ('000001.SZ','20220104',16.66),
    ('000002.SZ','20220104',20.49),
    ('000001.SZ','20220105',17.15),
    ('000002.SZ','20220105',21.17),
    ('000001.SZ','20220106',17.12),
    ('000002.SZ','20220106',21.05),
    ('000001.SZ','20220107',17.2),
    ('000002.SZ','20220107',21.89),
    ('000001.SZ','20220110',17.19),
    ('000002.SZ','20220110',22.16),
    ('000001.SZ','20220111',17.41),
    ('000002.SZ','20220111',22.3),
    ('000001.SZ','20220112',17),
    ('000002.SZ','20220112',22.05),
    ('000001.SZ','20220113',16.98),
    ('000002.SZ','20220113',21.53),
    ('000001.SZ','20220114',16.33),
    ('000002.SZ','20220114',20.7),
    ('000001.SZ','20220117',16.22),
    ('000002.SZ','20220117',20.87);
    

    样例结果

    在这里插入图片描述

    3 题解


    需要比较当天价格与前一天、后一天的价格进行比较,常规想法为进行关联,股票ID相等、日期为当天日期减1,为前一天价格,日期为当天价格加1,为后一天价格,然后进行计算;简化方法为使用 lag 和 lead 函数,可以避免进行表关联;

    • lag()函数
      • LAG(col,n,DEFAULT) 用于统计窗口内往上第 n 行。参数1为列名,参数2为往上第 n 行(可选,默认为1),参数3为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)
    • lead()函数
      • LEAD(col,n,DEFAULT) 用于统计窗口内往下第 n 行。参数1为列名,参数2为往下第 n 行(可选,默认为1),参数3为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)
    select 
      ts_code,
      trade_date,
      case when close> last_close and close>next_close then '波峰' else '波谷' end as type
    from 
    (select
       *,
       lag(close,1)over(partition by ts_code order by trade_date) last_close,
       lead(close,1)over(partition by ts_code order by trade_date) next_close 
    from t_stock_test)t
    where (close> last_close and close>next_close) 
    or (close< last_close and close<next_close);
    
  • 相关阅读:
    零知识证明在隐私保护和身份验证中的应用
    小红书店铺的所有商品API接口(整店商品详情查询接口)
    在poi-tl的区块对中实现用布尔值插入Word分页符的一种方法
    SpringMVC如何实现重定向和转发呢?
    golang中常用的空接口数据类型转换方法
    mybatis中#与$的区别
    浏览器与服务器通信过程(HTTP协议)
    solidity实战练习2--ERC20实现
    二叉搜索树--新增节点-力扣 701 题
    CFdiv2-Chip Move-(线性dp+状态枚举方式)
  • 原文地址:https://blog.csdn.net/hu_wei123/article/details/139100054