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

MySQL查询当日及7天前交易数返回null的解决方法

问题根因

你写的子查询中where条件两侧的date_id都属于子查询内部的transactions表,等价于判断date(date_id) = date(date_id) - 7天,这个条件永远不成立,因此子查询全返回null。要关联主表的日期,必须给表加别名区分作用域。


解法1:自关联查询(兼容性最好,适配所有SQL版本)

给两张相同的transactions表分别起别名区分,用主表的日期减7天关联另一张表的日期,最后过滤掉没有7天前数据的记录即可:

SELECT
  t1.date_id,
  t1.t_count,
  t2.t_count AS t_count_7d_prev
FROM transactions t1
LEFT JOIN transactions t2
  -- 不同数据库日期函数可能略有差异,SQL Server可替换为DATEADD(day,-7,t1.date_id)
  ON t2.date_id = DATE_SUB(t1.date_id, INTERVAL 7 DAY)
WHERE t2.t_count IS NOT NULL -- 过滤掉无7天前对应数据的日期,匹配你的预期输出
ORDER BY t1.date_id DESC

解法2:窗口函数(写法更简洁,支持MySQL8.0+/PostgreSQL/SQL Server等新版数据库)

直接用LAG偏移函数,按日期排序后取向前偏移7行的交易数即可:

WITH daily_trade AS (
  SELECT
    date_id,
    t_count,
    LAG(t_count,7) OVER(ORDER BY date_id ASC) AS t_count_7d_prev
  FROM transactions
)
SELECT * FROM daily_trade
WHERE t_count_7d_prev IS NOT NULL
ORDER BY date_id DESC

两种写法都可以得到你需要的预期结果。

内容的提问来源于stack exchange,提问作者sanjayr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 06:18:03