求无WITH子句的单SQL查询:DATA_TABLE日期关联取值(排除周末)
解决方案
没问题,这就给你写出符合要求的单条SQL查询——不用WITH子句,还能自动排除周末:
示例SQL(以MySQL为例)
SELECT main.Date, prev.Value AS `d-1`, main.Value AS `d`, next2.Value AS `d+2` FROM DATA_TABLE main LEFT JOIN DATA_TABLE prev ON prev.Date = DATE_SUB(main.Date, INTERVAL 1 DAY) LEFT JOIN DATA_TABLE next2 ON next2.Date = DATE_ADD(main.Date, INTERVAL 2 DAY) WHERE -- 过滤周六(DAYOFWEEK返回7)和周日(返回1) DAYOFWEEK(main.Date) NOT IN (1, 7) ORDER BY main.Date;
关键细节说明
- 自连接实现前后日期取值:通过两次自连接同一张表,分别匹配前一天(用
DATE_SUB减1天)和后两天(用DATE_ADD加2天)的数据,完全避开WITH子句的使用。 - 数据库适配调整:不同数据库的日期函数和周末判断逻辑略有差异,你可以按需修改WHERE子句:
- SQL Server:把
DAYOFWEEK(main.Date)换成DATEPART(WEEKDAY, main.Date),同样排除1(周日)和7(周六)即可。 - Oracle:推荐用
TO_CHAR(main.Date, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') NOT IN ('SAT', 'SUN'),避免地区差异导致的判断错误。
- SQL Server:把
- 空值灵活处理:用
LEFT JOIN会保留那些前一天/后两天无数据的行,对应列显示NULL;如果只需要前后都有数据的记录,把LEFT JOIN改成INNER JOIN就行。
这个查询会输出你要的格式,比如示例中的01-02-2018这条数据,因为它不是周末,会正确关联到前一天和后两天的数值。
内容的提问来源于stack exchange,提问作者JagaSrik
相关产品推荐
相关产品推荐

