You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:36:02