在Redshift SQL中的两个不同列中为日期之间的每一天创建一个新行

乔治

我正在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

计算两个日期之间一周中的每一天的发生次数

在RedShift中声明一个变量

经历两个日期之间的每一天

对于两个日期之间的每一天,请在“开始/结束”列中添加一行具有相同信息但仅当天的信息

在 Redshift 中查找下一个最旧的行

为每一天添加一个新的日期行,其中大于一个日期列并小于另一个日期列?

计算两个日期之间没有循环的一周中的每一天

Redshift-表格中每月的第一天和最后一天

在Redshift中的日期值之间重复行

在Redshift中从组中选择一个随机属性

在Redshift中合并行选择最后一个值

在redshift中声明变量

在单个查询中查询两个单独的 Redshift 集群?

在两个日期 BigQuery 之间的每一天重复记录?

MySQL如何按两个日期之间的每一天分组?

Redshift SQL查询-优化

Amazon Redshift SQL - 联合

SQL中是否有一种方法可以根据Redshift中的另一个字段值聚合行之间的列并可能重复行?

为每一天创建一个新行 (pd.date_range) - 合并、加入还是合并?

SQL(Redshift)在一个ID下连接多行

如何在 Redshift 中创建日期表?

Redshift创建表中的日期格式

Redshift-合并两列

是否可以在redshift中为不同的用户创建不同的空间?

计算redshift中不同的多个列

包括JS中第一天和最后一天的两个日期之间的差异

Redshift:使用默认为Now()的Timestamp列创建一个表

redshift 创建一个基于其他列的值的字段

Amazon Redshift中的ETL与ELT