如何用单个SQL查询获取时间区间数据及区间前最后一行?
可以用单个SQL实现需求
核心是通过UNION ALL合并两个结果集,同时保证不会出现重复数据:
最终SQL语句
-- 替换:start和:end为你的实际时间参数,比如'2024-01-01 00:00:00+00' SELECT confirmed_at, value FROM balance WHERE confirmed_at BETWEEN :start AND :end UNION ALL SELECT confirmed_at, value FROM balance WHERE confirmed_at < :start ORDER BY confirmed_at DESC LIMIT 1 ORDER BY confirmed_at;
执行逻辑
- 第一部分查询直接获取时间在[start, end]区间内的所有记录。
- 第二部分查询筛选出所有早于start的记录,按时间倒序取最后一条(
LIMIT 1),确保只拿到区间开始前的最新数据。 - 用
UNION ALL合并两个结果集,最后按时间正序排列,让结果按时间顺序展示。
特殊场景适配
- 当区间内无数据时:只会返回区间前的最后一条记录(如果存在),满足你获取最新历史值的需求。
- 当没有早于start的记录时:只会返回区间内的有效数据,不会产生空行。
- 若存在
confirmed_at恰好等于start的记录:只会在第一部分查询中出现一次,不会重复输出。
内容的提问来源于stack exchange,提问作者synic
相关产品推荐
相关产品推荐

