Getting date list in a range in PostgreSQL展示了如何在PostgreSQL中获取日期范围。但是,Redshift不支持generate_series()
ans=> select (generate_series('2012-06-29', '2012-07-03', '1 day'::interval))::date;
ERROR: function generate_series("unknown", "unknown", interval) does not exist
HINT: No function matches the given name and argument types. You may need to add explicit type casts.有没有办法复制generate_series()在Redshift中所做的?
发布于 2018-01-24 18:06:23
一次黑客攻击,但有效:
使用包含许多行的表和一个窗口函数来生成系列
只要您正在生成一个比用于生成该系列的表中的行数更小的系列,这就可以工作。
WITH x(dt) AS (SELECT '2016-01-01'::date)
SELECT
dateadd(
day,
COUNT(*) over(rows between unbounded preceding and current row) - 1,
dt)
FROM users, x
LIMIT 100初始日期2016-01-01控制开始日期,限制控制生成系列中的天数。
更新:*只在领导节点上运行
Redshift部分支持generate_series函数,但不幸的是,它们的文档中没有提到它。
这将起作用,也是产生一系列日期的最短和最易读的方式(2018-01-29):
SELECT ('2016-01-01'::date + x)::date
FROM generate_series(1, 100, 1) x发布于 2018-01-24 19:57:42
如果您不想依赖任何现有的表,一种选择是预生成一个包含一系列数字的系列表,每一行一个。
create table numbers as (
select
p0.n
+ p1.n*2
+ p2.n * power(2,2)
+ p3.n * power(2,3)
+ p4.n * power(2,4)
+ p5.n * power(2,5)
+ p6.n * power(2,6)
+ p7.n * power(2,7)
+ p8.n * power(2,8)
+ p9.n * power(2,9)
+ p10.n * power(2,10)
as number
from
(select 0 as n union select 1) p0,
(select 0 as n union select 1) p1,
(select 0 as n union select 1) p2,
(select 0 as n union select 1) p3,
(select 0 as n union select 1) p4,
(select 0 as n union select 1) p5,
(select 0 as n union select 1) p6,
(select 0 as n union select 1) p7,
(select 0 as n union select 1) p8,
(select 0 as n union select 1) p9,
(select 0 as n union select 1) p10
order by 1
);这将创建一个数字从0到2^10的表,如果需要更多的数字,只需添加更多的子句:D。
一旦您拥有了这个表,您就可以加入它作为generate_series的替代。
with date_range as (select
'2012-06-29'::timestamp as start_date ,
'2012-07-03'::timestamp as end_date
)
select
dateadd(day, number::int, start_date)
from date_range
inner join numbers on number <= datediff(day, start_date, end_date)发布于 2021-01-06 10:09:51
@michael_erasmus --这很有趣,为了更好的性能,我做了一些修改。
CREATE OR REPLACE VIEW v_series_0_to_1024 AS SELECT
p0.n
| (p1.n << 1)
| (p2.n << 2)
| (p3.n << 3)
| (p4.n << 4)
| (p5.n << 5)
| (p6.n << 6)
| (p7.n << 7)
| (p8.n << 8)
| (p9.n << 9)
as number
from
(select 0 as n union select 1) p0,
(select 0 as n union select 1) p1,
(select 0 as n union select 1) p2,
(select 0 as n union select 1) p3,
(select 0 as n union select 1) p4,
(select 0 as n union select 1) p5,
(select 0 as n union select 1) p6,
(select 0 as n union select 1) p7,
(select 0 as n union select 1) p8,
(select 0 as n union select 1) p9
order by number最后30天日期系列:
select dateadd(day, -number, current_date) as dt from v_series_0_to_1024 where number < 30https://stackoverflow.com/questions/48428786
复制相似问题