经典sql题(三)查找股票价格波峰波谷

了解价格的波动情况对市场决策至关重要,本文通过 SQL 查询,演示如何从一个价格数据表中提取价格波动信息,识别出波峰和波谷。我们假设有一个名为 test 的表,包含每个时间点的价格数据。

示例数据

假设我们的 test 表有以下数据:

id ds price
1 2023-10-01 08:00:00 100
1 2023-10-01 09:00:00 110
1 2023-10-02 10:00:00 105
1 2023-10-03 11:00:00 115
2 2023-10-01 10:00:00 200
2 2023-10-02 12:00:00 190
2 2023-10-03 14:00:00 195
2 2023-10-04 15:00:00 210
3 2023-10-01 16:00:00 300

查询步骤

第一步:计算前后价格

我们将使用窗口函数 LAGLEAD 来获取每个价格点的前后价格。

sql 复制代码
SELECT 
    id,
    ds,
    price,
    LAG(price, 1) OVER (PARTITION BY id ORDER BY ds) AS lag_price,
    LEAD(price, 1) OVER (PARTITION BY id ORDER BY ds) AS lead_price
FROM 
    test;

结果(中间表):

id ds price lag_price lead_price
1 2023-10-01 08:00:00 100 NULL 110
1 2023-10-01 09:00:00 110 100 105
1 2023-10-02 10:00:00 105 110 115
1 2023-10-03 11:00:00 115 105 NULL
2 2023-10-01 10:00:00 200 NULL 190
2 2023-10-02 12:00:00 190 200 195
2 2023-10-03 14:00:00 195 190 210
2 2023-10-04 15:00:00 210 195 NULL
3 2023-10-01 16:00:00 300 NULL NULL
第二步:识别波峰与波谷

在获取前后价格的基础上,我们接着使用 CASE 语句来标记波峰和波谷。

sql 复制代码
SELECT 
    id,
    ds,
    price,
    CASE 
        WHEN price > lag_price AND price > lead_price THEN '波峰'
        WHEN price < lag_price AND price < lead_price THEN '波谷'
        ELSE '无'
    END AS price_type
FROM (
    SELECT 
        id,
        ds,
        price,
        LAG(price, 1) OVER (PARTITION BY id ORDER BY ds) AS lag_price,
        LEAD(price, 1) OVER (PARTITION BY id ORDER BY ds) AS lead_price
    FROM 
        test
) AS subquery;

结果(最终结果):

id ds price price_type
1 2023-10-01 08:00:00 100
1 2023-10-01 09:00:00 110 波峰
1 2023-10-02 10:00:00 105 波谷
1 2023-10-03 11:00:00 115
2 2023-10-01 10:00:00 200
2 2023-10-02 12:00:00 190 波谷
2 2023-10-03 14:00:00 195
2 2023-10-04 15:00:00 210
3 2023-10-01 16:00:00 300

完整步骤解析

  1. 计算前后价格

    • 使用 LAGLEAD 函数,基于每个 id 的时间顺序提取前后价格。
  2. 识别波峰与波谷

    • 使用 CASE 语句判断当前价格的波动状态,标记为"波峰"、"波谷"或"无"。
相关推荐
Z_W_H_9 分钟前
【PostgreSQL】安装及使用(Navicat/Arcgis),连接(C#)
数据库·postgresql
andrew_121910 分钟前
腾讯 IEG 游戏前沿技术 一面复盘
java·redis·sql·面试
andrew_121912 分钟前
腾讯 IEG 游戏前沿技术 二面复盘
后端·sql·面试
shuxianshrng12 分钟前
鹰眼降尘系统怎么样
大数据·服务器·人工智能·数码相机·物联网
豆姐姐16 分钟前
金九银十,分享一波用例设计、数据库、编程笔试题!
自动化测试·数据库·测试用例·软件测试面试
优思学院16 分钟前
优思学院|如何从零开始自己学习六西格玛?
大数据·运维·服务器·学习·六西格玛黑带·cssbb
计算机程序设计开发18 分钟前
计算机毕业设计公交站点线路查询网站登录注册搜索站点线路车次/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序
数据库·vue.js·spring boot·课程设计·计算机毕业设计
JermeryBesian31 分钟前
Flink系列知识之:Checkpoint原理
大数据·flink
lwprain32 分钟前
编写第一个hadoop3.3.6的mapreduce程序
大数据·mapreduce
mizuhokaga43 分钟前
Hive parquet表通过csv文件导入数据
数据仓库·hive·hadoop