字节跳动面试SQL-股票的波峰和波谷
推荐阅读文章列表
SQL题目
来自今日头条数据研发一面
- 有一张股票交易价格表ods_stock_trd_log, 包含sto_code(股票代码)、trade_dt(交易日期)以及price(交易价格)
- 问题:求出每只股票对应的波峰和波谷
- 波峰:股票价格高于前一天和后一天价格时
- 波谷:股票价格低于前一天和后一天价格时
答案解析
模拟数据
INSERT INTO ods_stock_trd_log VALUES
('001','20220104',11.06),
('002','20220104',16.12),
('001','20220105',15.15),
('002','20220105',14.15),
('001','20220106',12.32),
('002','20220106',12.08),
('001','20220107',16.28),
('002','20220107',14.56)
;
思路分析
难点:如何获取上一个交易日和后一个交易日的股票价格
- 获取所有股票交易日期前一个日期对应的价格X以及后一个日期对应的价格Y
- 如果当前股票价格高于X和Y,那么此时即为波峰,反之,如果当前股票价格低于X和Y,那么此时即为波谷
具体代码
select
sto_code,
trade_dt,
case
when price > last_price and price > next_price then '波峰'
when price < last_price and price < next_price then '波谷'
else '' end as flag
from (
select
*,
-- 取向上一行的数据
lag(price, 1) over(partition by sto_code order by trade_dt) last_price,
-- 取向下一行的数据
lead(price, 1) over(partition by sto_code order by trade_dt) next_price
from ods_stock_trd_log
) t
where (price > last_price and price > next_price) -- 波峰
or (price < last_price and price < next_price) -- 波谷
;