3

我需要为报告创建一个空的时间表系列,以便我可以将多个表中的连接活动留给它。一天中的每个小时都不一定有数据,但我希望它显示空或零表示不活动,而不是省略一天中的那个小时。

在更高版本的 Postgres(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 可以运行其中一些命令,但是当您尝试将它与任何表一起运行时会引发错误。

我需要的:

生成一系列数字(例如 0-23)作为将在 redshift 上运行的子查询的可靠方法(使用 postgres 8.0.2)。

4

4 回答 4

11

只要您的表格的行数多于所需系列的数字,这就是过去对我有用的方法:

select
    (row_number() over (order by 1)) - 1 as hour
from
    large_table
limit 24
;

返回 numbers 0-23

于 2016-08-01T18:37:01.360 回答
1

2021 年 4 月为 Redshift 发布了递归。现在在 Redshift 中可以实现递归。您可以使用以下代码生成一系列数字(甚至表格)

with recursive numbers(NUMBER) as
(
select 1 UNION ALL
select NUMBER + 1 from numbers where NUMBER < 28
)
于 2021-08-26T23:13:26.437 回答
1

不幸的是,Amazon Redshift 不允许使用generate_series()for 表函数。解决方法似乎是创建一个数字表。

也可以看看:

于 2016-07-30T06:05:49.313 回答
1

我不喜欢仅仅为了获取行号列表而查询系统表。如果它像一天中的几个小时一样恒定且足够小,我会选择普通的旧的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任何你想要的。

于 2017-06-28T19:43:44.463 回答