Redshift 中的重叠函数
Posted
技术标签:
【中文标题】Redshift 中的重叠函数【英文标题】:Overlaps Function in Redshift 【发布时间】:2017-04-18 19:40:42 【问题描述】:我正在尝试创建一个真/假标志,当两个日期参数集包含一些重叠的时间或天时,该标志为真。我的理解是 Postgres 已经为此提供了一个名为“OVERLAPS”的函数,如本文档 8.4 所示:
[https://www.postgresql.org/docs/8.4/static/functions-datetime.html][1]
当我尝试在 redshift 中使用 OVERLAPS 时,该功能似乎有效,请参见下面的示例:
SELECT (DATE '2001-02-16', DATE '2001-12-21') OVERLAPS
(DATE '2001-10-30', DATE '2002-10-30');
但是,当我尝试使用它来填充列时,它会产生错误,请参见下面的示例,其中结果应该始终为真,因为它会将句点与自身进行比较。在此示例中,我使用带时区的时间戳,但我也尝试过不带时区的方法,并且只是日期,所有这些都失败并出现相同的错误。
CREATE TABLE date_table (
variable VARCHAR,
date_start TIMESTAMP WITH TIME ZONE,
date_end TIMESTAMP WITH TIME ZONE
)
;
INSERT INTO date_table VALUES ('max_date', TO_TIMESTAMP('2017/04/05
00:00:00', 'YYYY/MM/DD HH24:MI:SS'), TO_TIMESTAMP('2017/04/09 00:00:00',
'YYYY/MM/DD HH24:MI:SS'))
;
INSERT INTO date_table VALUES ('min_date', TO_TIMESTAMP('2016/04/06
00:00:00', 'YYYY/MM/DD HH24:MI:SS'), TO_TIMESTAMP('2016/04/15 00:00:00',
'YYYY/MM/DD HH24:MI:SS'))
;
INSERT INTO date_table VALUES ('min_date', TO_TIMESTAMP('2015/04/01
00:00:00', 'YYYY/MM/DD HH24:MI:SS'), TO_TIMESTAMP('2015/04/14 00:00:00',
'YYYY/MM/DD HH24:MI:SS'))
;
SELECT dt.*, (date_start, date_end) OVERLAPS (date_start, date_end) AS
overlap_test
FROM date_table dt
我得到的错误如下:
An error occurred when executing the SQL command:
SELECT dt.*, (date_start, date_end) OVERLAPS (date_start, date_end) AS overlap_test
FROM date_table dt
[Amazon](500310) Invalid operation: Specified types or functions (one per INFO message) not supported on Redshift tables.;
Warnings:
Function ""overlaps"(timestamp without time zone,timestamp without time zone,timestamp without time zone,timestamp without time zone)" not supported.
Execution time: 0.07s
Statement 1 of 1 finished
1 statement failed.
【问题讨论】:
Redshift 基于 Postgres 8.0,因此阅读任何后续版本的手册毫无意义。实际上开始阅读 Postgres 手册是没有意义的,您应该查阅 Redshift 手册:docs.aws.amazon.com/redshift/latest/dg/…(overlaps
似乎根本没有记录在那里)
关于错误:您的第一个示例使用 DATE
值。在您的第二个示例中,您使用的是 TIMESTAMP
值。正如错误消息所说,这显然不受支持
知道了,我的错,这里是 8.0 中列出的链接。 postgresql.org/docs/8.0/static/functions-datetime.html 由于第一个示例返回结果,它显然在 Redshift 中可用,并且 'OVERLAPS' 出现在 redshift 保留列表中:docs.aws.amazon.com/redshift/latest/dg/r_pg_keywords.html 只是好奇 redshift 似乎没有该函数的其他文档。跨度>
@a_horse_with_no_name,正如我提到的,我已经尝试过使用日期和时间戳,在这两种情况下似乎都失败了。
【参考方案1】:
Redshift 基于 Postgres,但它不是 Postgres。查看 Postgres 文档中可用的函数并不是一个好主意,Redshift 中唯一支持的函数是 Redshift 文档中明确列出的函数,在这种情况下仅支持 these date and time functions。不支持 OVERLAPS,因此您会收到警告消息。
我不确定为什么你的第一个 select 语句没有触发这个警告,可能是因为它没有查询任何实际的表。
【讨论】:
这很有帮助,我将停止尝试 Redshift 文档中未列出的功能,谢谢!以上是关于Redshift 中的重叠函数的主要内容,如果未能解决你的问题,请参考以下文章
没有函数或存储过程的 Amazon RedShift 中的 Upsert
Redshift 中的 Python UDF 函数始终返回 NULL 值