SQL查询实现个股触达目标价后停止返回后续数据的问题
实现方案
之前使用CASE表达式仅能实现字段标记,无法完成行级过滤,你需要先计算每只股票首次触及目标价的分界日期,再基于该日期过滤行情数据即可,通用实现方案如下:
我们先约定两张表的命名:
- 行情数据表:
stock_daily,包含字段Ticker、Date、Open、Close、High、Low - 自选目标价表:
watchlist,包含字段Ticker、Target
SQL实现(适用于数据库查询场景)
WITH first_reach_cal AS ( -- 计算每只股票首次触及目标价的日期 SELECT sd.Ticker, MIN(CASE WHEN sd.High >= wl.Target THEN sd.Date END) AS first_reach_date FROM stock_daily sd LEFT JOIN watchlist wl ON sd.Ticker = wl.Ticker GROUP BY sd.Ticker ) SELECT sd.* FROM stock_daily sd LEFT JOIN first_reach_cal frc ON sd.Ticker = frc.Ticker WHERE -- 从未触达目标价的股票返回全部数据 frc.first_reach_date IS NULL -- 已触达的仅返回达标日及之前的行情 OR sd.Date <= frc.first_reach_date ORDER BY sd.Ticker, sd.Date;
Python Pandas实现(适用于本地数据处理场景)
import pandas as pd # 关联行情表与目标价表 merge_df = stock_daily.merge(watchlist, on="Ticker", how="left") # 计算每只股票首次达标日期 first_reach_date = merge_df[merge_df["High"] >= merge_df["Target"]].groupby("Ticker")["Date"].min().rename("first_reach_date") # 关联回原表后过滤 result_df = merge_df.merge(first_reach_date, on="Ticker", how="left") result_df = result_df[(result_df["first_reach_date"].isna()) | (result_df["Date"] <= result_df["first_reach_date"])] # 移除冗余字段 result_df = result_df.drop(columns=["Target", "first_reach_date"])
内容的提问来源于stack exchange,提问作者TommyK
相关产品推荐
相关产品推荐

