我尝试了以下内容:
SELECT * FROM generate_series(2,4);
generate_series
-----------------
2
3
4
(3 rows)
SELECT * FROM generate_series(5,1,-2);
generate_series
-----------------
5
3
1
(3 rows)
但是当我尝试时,
select * from generate_series('2011-12-31'::timestamp, '2012-12-31'::timestamp, '1 day');
它产生了错误。
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.
我在Redshift 1.0.757上使用PostgreSQL 8.0.2 知道为什么会这样吗?
更新
generate_series现在正在使用Redshift。
SELECT CURRENT_DATE::TIMESTAMP - (i * interval '1 day') as date_datetime
FROM generate_series(1,31) i
ORDER BY 1
这将生成最近30天的日期
答案 0 :(得分:19)
Postgres 8.4中添加了支持日期和时间戳的generate_series()
版本。
由于Redshift基于Postgres 8.0,您需要使用不同的方式:
select timestamp '2011-12-31 00:00:00' + (i * interval '1 day')
from generate_series(1, (date '2012-12-31' - date '2011-12-31')) i;
如果你只是"只有"需要日期,这可以缩写为:
select date '2011-12-31' + i
from generate_series(1, (date '2012-12-31' - date '2011-12-31')) i;
答案 1 :(得分:1)
generate_series现在正在使用Redshift。
SELECT CURRENT_DATE::TIMESTAMP - (i * interval '1 day') as date_datetime
FROM generate_series(1,31) i
ORDER BY 1
这将生成最近30天的日期
答案 2 :(得分:0)
Redshift中的日期范围没有generate_series()
功能,但您可以使用以下步骤生成系列...
步骤1:创建表格genid并将常量值插入为生成序列所需的次数。如果您需要生成12个月的系列,您可以插入12次。更好的是你可以插入更多的次数,比如100,这样你就不会遇到任何问题。
create table genid(id int)
------------数月 插入genid值(1)
第2步:您需要为其生成系列的表。
create table pat(patid varchar(10),stdt timestamp, enddt timestamp);
insert into pat values('Pat01','2018-03-30 00:00:00.0','2018-04-30 00:00:00.0')
insert into pat values('Pat02','2018-02-28 00:00:00.0','2018-04-30 00:00:00.0')
insert into pat values('Pat03','2017-10-28 00:00:00.0','2018-04-30 00:00:00.0')
第3步:此查询将为您生成系列。
with cte as
(
select max(enddt) as maxdt
from pat
) ,
cte2 as(
select dateadd('month', -1 * row_number() over(order by 1), maxdt::date ) as gendt
from genid , cte
) select *
from pat, cte2
where gendt between stdt and enddt
答案 3 :(得分:0)
我找到了解决方案here,因为我的问题是无法使用generate_series()在Redshift上生成时间维度表。您可以使用以下SQL代码段生成临时序列。
with digit as (
select 0 as d union all
select 1 union all select 2 union all select 3 union all
select 4 union all select 5 union all select 6 union all
select 7 union all select 8 union all select 9
),
seq as (
select a.d + (10 * b.d) + (100 * c.d) + (1000 * d.d) as num
from digit a
cross join
digit b
cross join
digit c
cross join
digit d
order by 1
)
select (getdate()::date - seq.num)::date as "Date"
from seq;
在Redshift上似乎还不完全支持generate_series()函数。如果我运行DJo答案中提到的SQL,它会起作用,因为SQL仅在领导者节点上运行。如果我将dim_time插入到同一SQL的前面,则不起作用。