我正在Redshift中使用一张桌子。它包含带有一些信息和两个日期(开始日期和结束日期)的行。我似乎无法找出一种在开始日期和结束日期之间每天创建新行的方法。例如,下面的代码制作一个简单的表:
CREATE TEMPORARY TABLE dates (name VARCHAR(50), start_date DATETIME, end_date DATETIME)
INSERT INTO dates
VALUES
('Peter F.','2018-03-01','2018-03-05'),
('Sam R.','2018-04-17', '2018-04-20');
SELECT * FROM dates;
我怎么去
name | start_date | end_date |
Peter F. | 2018-04-17 00:00:00.000000| 2018-04-20 00:00:00.000000 |
Sam R. | 2018-03-01 00:00:00.000000| 2018-03-05 00:00:00.000000 |
至:
name | start_date | end_date |
Peter F. | 2018-04-17 00:00:00.000000| 2018-04-20 00:00:00.000000 |
Peter F. | 2018-04-18 00:00:00.000000| 2018-04-20 00:00:00.000000 |
Peter F. | 2018-04-19 00:00:00.000000| 2018-04-20 00:00:00.000000 |
Peter F. | 2018-04-20 00:00:00.000000| 2018-04-20 00:00:00.000000 |
Sam R. | 2018-03-01 00:00:00.000000| 2018-03-05 00:00:00.000000 |
Sam R. | 2018-03-02 00:00:00.000000| 2018-03-05 00:00:00.000000 |
Sam R. | 2018-03-03 00:00:00.000000| 2018-03-05 00:00:00.000000 |
Sam R. | 2018-03-04 00:00:00.000000| 2018-03-05 00:00:00.000000 |
Sam R. | 2018-03-05 00:00:00.000000| 2018-03-05 00:00:00.000000 |
我尝试使用像这样的递归CTE:
WITH cte
AS (SELECT name,
start_date,
end_date
FROM dates
UNION ALL
SELECT name,
Dateadd(day, 1, start_date),
end_date
FROM cte
WHERE start_date < end_date)
SELECT *
FROM cte
但这给了我一个错误:
[Amazon](500310) Invalid operation: relation "cte" does not exist;
希望获得专家的建议,因为我真的很希望能够使用SQL进行此操作...预先谢谢!
Redshift不支持递归公用表表达式。
一种方法是建立数字表:
create table nums(n int);
insert into nums values(0), (1), (2), (3), ...
然后,您可以将数字表与原始表连接起来以生成预期结果:
select
d.name,
dateadd(day, n.n, d.start_date) start_date,
d.end_date
from dates d
inner join nums n
on dateadd(day, n.n, d.start_date) <= d.end_date
您也可以直接在查询中将数字作为派生表列出,或用于row_number()
大型表。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句