REDSHIFT:如何在不在 redshift (Postgres 8.0.2) 中创建名为 "numbers" 的 table 的情况下生成一系列数字?
REDSHIFT: How can I generate a series of numbers without creating a table called "numbers" in redshift (Postgres 8.0.2)?
我需要为报告创建一个空的时间 table 系列,这样我就可以从多个 table 中加入 activity 到它。一天中的每个小时不一定都有数据,但我希望它在 activity 中显示 null 或零,而不是省略一天中的那个小时。
在更高版本的 Postgres (post 8.0.2) 中,这在几个方面很容易:
SELECT unnest(array[0,1,2,3,4...]) as numbers
或
CROSS JOIN (select generate_series as hours
from generate_series(now()::timestamp,
now()::timestamp + interval '1 day',
'1 hour'::interval
)) date_series
Redshift 可以 运行 其中一些命令,但是当您尝试 运行 将其与任何 table 结合使用时会抛出错误。
我需要什么:
生成一系列数字(例如 0-23)的可靠方法作为子查询,将 运行 红移(使用 postgres 8.0.2).
遗憾的是,Amazon Redshift 不允许对 table 函数使用 generate_series()
。解决方法似乎是创建 table 个数字。
另请参阅:
- Using sql function generate_series() in redshift
- Generate Series in Redshift and MySQL,这看起来不正确,但确实引入了一些有趣的想法
只要您的 table 行数多于所需系列的数量,这就是过去对我有用的方法:
select
(row_number() over (order by 1)) - 1 as hour
from
large_table
limit 24
;
returns 个数字 0-23
。
我不太喜欢查询系统 table 只是为了获取行号列表。如果它像一天中的几个小时一样恒定且足够小,我会选择普通的 UNION ALL
:
WITH
hours_in_day AS (
SELECT 0 AS hour
UNION ALL SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
...
UNION ALL SELECT 23
)
然后加入hours_in_day
任何你想加入的。
Recursion was released for Redshift in April 2021. 现在在 Redshift 中递归是可能的。您可以使用以下代码生成一系列数字(甚至 table)
with recursive numbers(NUMBER) as
(
select 1 UNION ALL
select NUMBER + 1 from numbers where NUMBER < 28
)
我需要为报告创建一个空的时间 table 系列,这样我就可以从多个 table 中加入 activity 到它。一天中的每个小时不一定都有数据,但我希望它在 activity 中显示 null 或零,而不是省略一天中的那个小时。
在更高版本的 Postgres (post 8.0.2) 中,这在几个方面很容易:
SELECT unnest(array[0,1,2,3,4...]) as numbers
或
CROSS JOIN (select generate_series as hours
from generate_series(now()::timestamp,
now()::timestamp + interval '1 day',
'1 hour'::interval
)) date_series
Redshift 可以 运行 其中一些命令,但是当您尝试 运行 将其与任何 table 结合使用时会抛出错误。
我需要什么:
生成一系列数字(例如 0-23)的可靠方法作为子查询,将 运行 红移(使用 postgres 8.0.2).
遗憾的是,Amazon Redshift 不允许对 table 函数使用 generate_series()
。解决方法似乎是创建 table 个数字。
另请参阅:
- Using sql function generate_series() in redshift
- Generate Series in Redshift and MySQL,这看起来不正确,但确实引入了一些有趣的想法
只要您的 table 行数多于所需系列的数量,这就是过去对我有用的方法:
select
(row_number() over (order by 1)) - 1 as hour
from
large_table
limit 24
;
returns 个数字 0-23
。
我不太喜欢查询系统 table 只是为了获取行号列表。如果它像一天中的几个小时一样恒定且足够小,我会选择普通的 UNION ALL
:
WITH
hours_in_day AS (
SELECT 0 AS hour
UNION ALL SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
...
UNION ALL SELECT 23
)
然后加入hours_in_day
任何你想加入的。
Recursion was released for Redshift in April 2021. 现在在 Redshift 中递归是可能的。您可以使用以下代码生成一系列数字(甚至 table)
with recursive numbers(NUMBER) as
(
select 1 UNION ALL
select NUMBER + 1 from numbers where NUMBER < 28
)