Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在红移中创建日期表?_Sql_Date_Amazon Redshift - Fatal编程技术网

Sql 如何在红移中创建日期表?

Sql 如何在红移中创建日期表?,sql,date,amazon-redshift,Sql,Date,Amazon Redshift,tl;dr:我想用红移生成一个日期表,以便更容易生成报告。最好不需要已经处于红移状态的大型表,也不需要上传csv文件 长版本: 我正在编写一份报告,其中我必须平均每周每天创建的新项目。日期范围可能跨越数月或更长时间,因此可能会有5个星期一,但只有4个星期天,这可能会使计算变得有点棘手。此外,我不能保证每天都有一个单一项目的实例,尤其是当用户开始切片数据时。这是BI工具的绊倒 解决此问题的最佳方法很可能是日期表。然而,大多数关于日期表的教程都使用了SQL命令,这些命令不可用或不完全受Redshif

tl;dr:我想用红移生成一个日期表,以便更容易生成报告。最好不需要已经处于红移状态的大型表,也不需要上传csv文件

长版本: 我正在编写一份报告,其中我必须平均每周每天创建的新项目。日期范围可能跨越数月或更长时间,因此可能会有5个星期一,但只有4个星期天,这可能会使计算变得有点棘手。此外,我不能保证每天都有一个单一项目的实例,尤其是当用户开始切片数据时。这是BI工具的绊倒

解决此问题的最佳方法很可能是日期表。然而,大多数关于日期表的教程都使用了SQL命令,这些命令不可用或不完全受Redshift支持(我看的是generate_series)

是否有一种简单的方法以红移方式生成日期表?

我试图使用的代码:(基于此建议,也不起作用:)

它抛出了这个错误

[Amazon](500310) Invalid operation: Specified types or functions (one per INFO message) not supported on Redshift tables.;
1 statement failed.

。。。因为,我假设在Redshift中不允许在同一个命令中插入和生成\u序列作为解决方法,所以您可以在本地计算机上旋转Postgres实例,在那里运行代码,导出到CSV,然后仅在Redshift中运行
创建表
部分并从CSV加载数据。由于这是一个一次性操作,所以可以这样做,这就是我实际为新的红移部署所做的。

作为一种解决方法,您可以在本地计算机上旋转Postgres实例,在那里运行代码,导出到CSV,然后仅在红移中运行
创建表
部分并从CSV加载数据。由于这是一次性操作,所以可以这样做,这就是我为新的红移部署所做的实际操作。

在问这个问题时,我明白了。哎呀

我从“事实”模式开始

运行以下命令以启动数字表:

create table facts.numbers
(
  number int PRIMARY KEY
)
;
使用此选项生成您的号码列表。我用了一百万开始

SELECT ',(' || generate_series(0,1000000,1) || ')'
;
然后复制粘贴以下查询结果中的数字,在值之后:

INSERT INTO facts.numbers
VALUES
 (0)
,(1)
,(2)
,(3)
,(4)
,(5)
,(6)
,(7)
,(8)
,(9)
-- etc
^确保从复制粘贴的数字列表中删除前导逗号

一旦有了数字表,就可以生成日期表(同样,从elliot land窃取代码):


^一定要在末尾为你需要的日期范围设置数字

在问这个问题时,我算出来了。哎呀

我从“事实”模式开始

运行以下命令以启动数字表:

create table facts.numbers
(
  number int PRIMARY KEY
)
;
使用此选项生成您的号码列表。我用了一百万开始

SELECT ',(' || generate_series(0,1000000,1) || ')'
;
然后复制粘贴以下查询结果中的数字,在值之后:

INSERT INTO facts.numbers
VALUES
 (0)
,(1)
,(2)
,(3)
,(4)
,(5)
,(6)
,(7)
,(8)
,(9)
-- etc
^确保从复制粘贴的数字列表中删除前导逗号

一旦有了数字表,就可以生成日期表(同样,从elliot land窃取代码):


^请确保为所需的日期范围在末尾设置数字

以下是构建
事实的不同建议。不需要手动干预的数字

  • 取一个已知或稳定大小的系统表(保证存在)
  • 交叉连接
    将表自身连接到足够的时间,以获得所需的行数
  • 选择(按1排序)上方的
    行编号()
    将创建的记录转换为一组升序编号
  • 使用红移系统表pg_catalog.pg_operator的示例(截至2020年10月有659条记录):

    --Prep,以便您可以复制/粘贴代码示例
    如果不存在事实,则创建架构;——确保架构存在
    如果存在facts.numbers,则删除表;——如果该表已经存在,则避免出现错误;
    创建表facts.numbers--创建表定义
    (
    数字整型主键
    );
    --你关心的那一点
    插入事实。数字
    选择(按1排序)上的行数()——返回1..n以代替原始记录
    来自pg_catalog.pg_操作员a--659条记录
    交叉连接pg_catalog.pg_操作符b——获取659^2=434k记录
    交叉连接pg_catalog.pg_操作符c——获取659^3=286M记录
    限制2000000——将结果限制在合理的大小
    ;
    
    这里有一个不同的建议,用于构建不需要手动干预的
    事实。数字:

  • 取一个已知或稳定大小的系统表(保证存在)
  • 交叉连接
    将表自身连接到足够的时间,以获得所需的行数
  • 选择(按1排序)上方的
    行编号()
    将创建的记录转换为一组升序编号
  • 使用红移系统表pg_catalog.pg_operator的示例(截至2020年10月有659条记录):

    --Prep,以便您可以复制/粘贴代码示例
    如果不存在事实,则创建架构;——确保架构存在
    如果存在facts.numbers,则删除表;——如果该表已经存在,则避免出现错误;
    创建表facts.numbers--创建表定义
    (
    数字整型主键
    );
    --你关心的那一点
    插入事实。数字
    选择(按1排序)上的行数()——返回1..n以代替原始记录
    来自pg_catalog.pg_操作员a--659条记录
    交叉连接pg_catalog.pg_操作符b——获取659^2=434k记录
    交叉连接pg_catalog.pg_操作符c——获取659^3=286M记录
    限制2000000——将结果限制在合理的大小
    ;
    
    好主意,但我找到了一种不用上传csv的方法。不幸的是,它确实需要一些复制粘贴魔法。如果您有任何改进,我会在下面发布我的解决方案。这是个好主意,但我找到了一种不用上传csv的方法。不幸的是,它确实需要一些复制粘贴魔法。如果您有任何改进,我会在下面发布我的解决方案。正如您所发现的,