SQL查询无关联表实现日期匹配所属周期的技术咨询
解决方案
常规关系型数据库解法(支持不等值JOIN)
绝大多数主流数据库(MySQL、PostgreSQL、Oracle、Spark SQL等)都支持不等值连接,直接使用LEFT JOIN搭配区间匹配条件即可实现需求:
SELECT b.date AS b_date, a.name AS corresponding_period_name FROM table_b b LEFT JOIN table_a a ON b.date >= a.startdate AND b.date <= a.enddate;
特殊场景适配
- 存在周期重叠的情况:如果一个日期同时落在多个周期的区间内,上述查询会返回多条同日期的记录,每个匹配的周期对应一行。如果要求每个日期仅返回一个周期,可增加排序规则取优先级最高的结果,示例取开始时间最晚的周期:
SELECT b_date, corresponding_period_name FROM ( SELECT b.date AS b_date, a.name AS corresponding_period_name, ROW_NUMBER() OVER (PARTITION BY b.date ORDER BY a.startdate DESC) AS rank_num FROM table_b b LEFT JOIN table_a a ON b.date >= a.startdate AND b.date <= a.enddate ) temp WHERE rank_num = 1; - 不支持不等值JOIN的场景:如果你使用的查询引擎不支持不等值连接(部分低版本数仓引擎、特殊存储结构的查询系统有这类限制),可以先预处理表A生成「单个日期-对应周期名」的全量映射表,再和表B做等值JOIN即可。你可以根据所用工具的日期序列生成能力,把表A的每个周期区间展开为该区间内所有日期的单行记录来生成映射表。
内容的提问来源于stack exchange,提问作者Milan Pijanovic
相关产品推荐
相关产品推荐

