如何跨日期查询不同列数据?实现daily_price表特定行情筛选
解决daily_price表的条件查询问题
需求是从daily_price表中筛选出2022-08-31当日满足以下两个条件的记录:
- 当日
close> 当日open - 当日
close> 同一股票(symbol)昨日的high
原查询的问题
你写的查询逻辑错误在于两个子查询没有按symbol关联,会把2022-08-31所有股票的close和2022-08-30所有股票的high做无差别比较,无法对应到同一股票的昨日数据,导致结果不符合预期。
正确解法
方法1:自连接(通用SQL写法)
通过自连接将当日数据与同一股票的昨日数据关联,精准匹配每个股票的昨日high:
SELECT t1.* FROM daily_price t1 JOIN daily_price t2 ON t1.symbol = t2.symbol AND t2.date = DATE_SUB(t1.date, INTERVAL 1 DAY) -- 不同数据库日期函数有差异,比如PostgreSQL用 t1.date - INTERVAL '1 day' WHERE t1.date = '2022-08-31' AND t1.close > t1.open AND t1.close > t2.high;
方法2:窗口函数(适用于支持LAG的数据库,如MySQL8+、PostgreSQL等)
用LAG()窗口函数直接获取同一股票的昨日high值,写法更简洁:
SELECT symbol, date, open, high, low, close FROM ( SELECT *, -- 按股票分组、日期排序,取上一条记录的high(即昨日high) LAG(high) OVER (PARTITION BY symbol ORDER BY date) AS prev_day_high FROM daily_price ) AS sub WHERE date = '2022-08-31' AND close > open AND close > prev_day_high;
验证结果
用你提供的示例数据测试,两种方法都会返回ACR的2022-08-31记录,符合预期。
内容的提问来源于stack exchange,提问作者RuthlessCheese
相关产品推荐
相关产品推荐

