如何获取date_from到date_to之间的日期集合并拆分为单独行
解决方案
方法1:修正你现有的日期表关联方案
你之前用Cross Join没得到预期结果是因为漏了日期区间匹配的过滤条件,调整后的写法如下:
SELECT t.good_id, d.all_date FROM 你的原表名 t CROSS JOIN 全量日期表名 d WHERE d.all_date BETWEEN t.from_date AND t.to_date
Cross Join本身会生成两个表的全量笛卡尔积,加上WHERE子句的过滤后,就只会保留落在商品对应日期间隔内的记录,刚好匹配你要的输出。
方法2:无现成日期表时用递归CTE实现
如果你没有提前建好的全量日期表,可以用递归CTE动态生成日期序列,适配MySQL 8.0+、PostgreSQL、SQL Server、Spark SQL等绝大多数主流SQL引擎:
WITH RECURSIVE date_series AS ( -- 递归基:取每个商品的起始日期作为第一条记录 SELECT good_id, from_date AS all_date, to_date FROM 你的原表名 UNION ALL -- 递归逻辑:每次加1天,直到到达结束日期 SELECT good_id, DATE_ADD(all_date, INTERVAL 1 DAY), to_date FROM date_series WHERE all_date < to_date ) SELECT good_id, all_date FROM date_series ORDER BY good_id, all_date
方法3:Hive/Spark SQL专属简化写法
如果是在大数据场景用Hive或者Spark SQL,可以直接用sequence+explode函数实现,语法更简洁:
SELECT good_id, explode(sequence(from_date, to_date, interval 1 day)) AS all_date FROM 你的原表名
内容的提问来源于stack exchange,提问作者nhhthong
相关产品推荐
相关产品推荐

