首页 > 解决方案 > SQL)我似乎无法弄清楚如何使用 Lead() 方法比较 SQL 中的连续行

问题描述

我的数据库包括每个工作日的每个股票 [daily_price]:

库存 日期 价格
苹果 2018-06-01 100 美元
苹果 2018-06-02 130 美元
苹果 2018-06-03 143 美元
苹果 2018-06-04 286 美元
... ... ...
谷歌 2021-03-13 3000 美元
谷歌 2021-03-14 3900 美元
谷歌 2021-03-15 7800 美元
谷歌 2021-03-16 3900 美元
... ... ...

我想做一个如下所示的查询:

(试图查看未来 3 天 D+1 上涨超过 30% 的股票的走势)

库存 D+1 % D+2 % D+3 %
苹果 2018-06-02 2018-06-04 +30% +10% +100%
苹果 2021-03-14 2021-03-16 +30% +100% -50%

我的查询[试图使用lead()]如下:

WITH comparing_price AS (
    SELECT
        CODE, DATE, OPEN, high, low, close, volume,
        LEAD(daily_price, 1) OVER (PARTITION BY CODE ORDER BY DATE) AS x1,
        LEAD(daily_price, 2) OVER (PARTITION BY CODE ORDER BY DATE) AS x2,
        LEAD(daily_price, 3) OVER (PARTITION BY CODE ORDER BY DATE) AS x3
    FROM daily_price x0
)
SELECT
    x0.code as 'Stock',
    x1.date as 'From',
    x3.date as 'To',
    100*(x1.close - x0.close)/x0.close AS 'D+1 %',
    100*(x2.close - x1.close)/x1.close AS 'D+2 %',
    100*(x3.close - x2.close)/x2.close AS 'D+2 %'
FROM
    comparing_price
WHERE
    100*(x1.close - x0.close)/x0.close >= '30'; 

My Table 的主键是来自 [daily_price] 数据库的股票名称 [代码] 和日期 [日期]。

它给了我 SQL 错误 1054:“字段列表”中的未知列“daily_price”

标签: sqlcomparelead

解决方案


您的别名已关闭并且到处都是。但是,您甚至不需要在这里使用表别名,因为只涉及一个表/CTE。试试这个版本:

WITH comparing_price AS (
    SELECT
        CODE, DATE, OPEN, high, low, close, volume,
        LEAD(daily_price, 1) OVER (PARTITION BY CODE ORDER BY DATE) AS x1,
        LEAD(daily_price, 2) OVER (PARTITION BY CODE ORDER BY DATE) AS x2,
        LEAD(daily_price, 3) OVER (PARTITION BY CODE ORDER BY DATE) AS x3
    FROM daily_price
)

SELECT
    CODE AS Stock,
    DATE AS `From`,
    DATE + INTERVAL 2 DAY AS `To`,
    100*(x1 - x0) / x0 AS `D+1 %`,
    100*(x2 - x1) / x1 AS `D+2 %`,
    100*(x3 - x2) / x2 AS `D+2 %`
FROM comparing_price
WHERE
    100*(x1 - x0) / x0 >= 30; 

推荐阅读