SQL实现统计A表落在B表相邻两行日期区间内的记录行数
需求说明
- 涉及两张业务表:表A、表B,其中表B包含日期类型列
dateB - 统计逻辑:按表B
dateB列的升序顺序,依次取相邻两行的日期值构造统计区间:第N行dateB为区间左边界、第N+1行dateB为区间右边界,逐段统计表A中date列值落在对应区间内的记录条数 - 输出要求:返回结果集需包含每个表B原始
dateB值对应的统计字段Qty
注:区间匹配规则为左闭右开,即匹配满足
date >= 区间左边界 AND date < 区间右边界的记录;表B最后一行记录无后续相邻行,对应区间为[最后一行dateB值, +∞),统计逻辑与其他区间保持一致。
示例数据
- 表A(仅包含
date列)的记录值:10:00、10:01、10:05、10:20、10:21、10:22、10:23、10:24 - 表B(仅包含
dateB列)的记录值:10:00、10:10、10:20、10:30 - 预期返回结果(包含
date、Qty两列):
| date | Qty |
|---|---|
| 10:00 | 3 |
| 10:10 | 0 |
| 10:20 | 5 |
| 10:30 | 0 |
参考实现(SQL)
通过窗口函数快速构造相邻日期间隔,再关联统计即可:
WITH b_interval AS ( SELECT dateB AS start_date, LEAD(dateB, 1, '9999-12-31 23:59:59') OVER (ORDER BY dateB) AS end_date FROM tableB ) SELECT bi.start_date AS date, COUNT(a.date) AS Qty FROM b_interval bi LEFT JOIN tableA a ON a.date >= bi.start_date AND a.date < bi.end_date GROUP BY bi.start_date ORDER BY bi.start_date;
内容的提问来源于stack exchange,提问作者BinaryBen
相关产品推荐
相关产品推荐

