在redshift中使用sql函数generate_series()

Elm*_*Elm 18 sql generate-series amazon-redshift

我想在redshift中使用generate系列函数,但还没有成功.

redshift文档说它不受支持.以下代码确实有效:

select *
from generate_series(1,10,1)
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
3
...
10
Run Code Online (Sandbox Code Playgroud)

我想对约会做同样的事情.我尝试了很多变种,包括:

select *
from generate_series(date('2008-10-01'),date('2008-10-10 00:00:00'),1)
Run Code Online (Sandbox Code Playgroud)

踢出去:

 ERROR: function generate_series(date, date, integer) does not exist
 Hint: No function matches the given name and argument types.
 You may need to add explicit type casts. [SQL State=42883]
Run Code Online (Sandbox Code Playgroud)

还尝试过:

select *
from generate_series('2008-10-01 00:00:00'::timestamp,
'2008-10-10 00:00:00'::timestamp,'1 day')
Run Code Online (Sandbox Code Playgroud)

并试过:

select *
from generate_series(cast('2008-10-01 00:00:00' as datetime),
cast('2008-10-10 00:00:00' as datetime),'1 day')
Run Code Online (Sandbox Code Playgroud)

两个都踢了出来:

ERROR: function generate_series(timestamp without time zone, timestamp without time zone, "unknown") does not exist
Hint: No function matches the given name and argument types.
You may need to add explicit type casts. [SQL State=42883]
Run Code Online (Sandbox Code Playgroud)

如果看起来不像我将从另一篇文章中使用此代码:

SELECT to_char(DATE '2008-01-01'
+ (interval '1 month' * generate_series(0,57)), 'YYYY-MM-DD') AS ym
Run Code Online (Sandbox Code Playgroud)

PostgreSQL generate_series()以SQL函数作为参数

Mik*_*ll' 18

Amazon Redshift似乎基于PostgreSQL 8.0.2.generate_series()的时间戳参数在8.4中添加.

这样可以回避这个问题的东西可能会在Redshift中起作用.

SELECT current_date + (n || ' days')::interval
from generate_series (1, 30) n
Run Code Online (Sandbox Code Playgroud)

它适用于PostgreSQL 8.3,这是我可以测试的最早版本.它记录在8.0.26中.

后来...

似乎在Redshift中不支持generate_series().但鉴于你已经证实它select * from generate_series(1,10,1) 确实有效,上面的语法至少会给你一个战斗机会.(虽然间隔数据类型也记录为在Redshift上不受支持.)

还是晚一点...

您还可以创建一个整数表.

create table integers (
  n integer primary key
);
Run Code Online (Sandbox Code Playgroud)

随便填充它.您可以在本地使用generate_series(),转储表并在Redshift上加载它.(我不知道;我不使用Redshift.)

无论如何,您可以使用该表进行简单的日期算术,而无需直接引用generate_series()或间隔数据类型.

select (current_date + n)
from integers
where n < 31;
Run Code Online (Sandbox Code Playgroud)

至少在8.3中有效.


Gab*_*own 13

今天使用Redshift,您可以使用日期时间函数生成一系列日期并输入数字表.

select (getdate()::date - generate_series)::date from generate_series(1,30,1)
Run Code Online (Sandbox Code Playgroud)

为我生成这个

date
2015-11-06
2015-11-05
2015-11-04
2015-11-03
2015-11-02
2015-11-01
2015-10-31
2015-10-30
2015-10-29
2015-10-28
2015-10-27
2015-10-26
2015-10-25
2015-10-24
2015-10-23
2015-10-22
2015-10-21
2015-10-20
2015-10-19
2015-10-18
2015-10-17
2015-10-16
2015-10-15
2015-10-14
2015-10-13
2015-10-12
2015-10-11
2015-10-10
2015-10-09
2015-10-08
Run Code Online (Sandbox Code Playgroud)

  • 查询,`with series AS(select*from generate_series(1,10,1))select*from series`,确实有效.但是,只要将它与另一个表连接,`用系列AS(select*from generate_series(1,10,1))select*from series join mytable on true`,那么我仍然得到错误`Function"generate_series(整数) ,整数,整数)"不支持 (11认同)
  • 虽然这会生成一个系列,但我找不到任何方法(CTE,子查询或插入表或临时表以将其连接到另一个表进行过滤). (5认同)
  • @cfeduke你可以把它包装成一个临时表作为```与系列AS(select*from generate_series(1,10,1))select*from series``` (2认同)

DJo*_*DJo 6

generate_series()Redshift不完全支持该功能.请参阅开发人员指南的不支持的PostgreSQL函数部分.

UPDATE

generate_series现在正在使用Redshift.

SELECT CURRENT_DATE::TIMESTAMP  - (i * interval '1 day') as date_datetime 
FROM generate_series(1,31) i 
ORDER BY 1
Run Code Online (Sandbox Code Playgroud)

这将生成最近30天的日期

参考:Amazon Redshift中的generate_series函数

  • 看起来“ generate_series()”偶尔会起作用,但如果在连接到实际表的查询中使用时可靠地失败。我的猜测是,这些示例查询在领导节点上运行并成功,但是在其他节点上运行时失败。从您到不支持的功能文档的链接:“在领导者节点上运行时,某些不支持的功能不会返回错误” (2认同)