NULLIF 在 Amazon Redshift 中产生不正确的输出?
Posted
技术标签:
【中文标题】NULLIF 在 Amazon Redshift 中产生不正确的输出?【英文标题】:NULLIF produces incorrect output in Amazon Redshift? 【发布时间】:2016-07-26 15:16:08 【问题描述】:以下代码应为列lag
和lag2
生成相同的值:
CREATE TABLE bug1 (
id INT,
value INT
);
INSERT INTO bug1 VALUES (1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3);
SELECT
id,
value,
(LAG(value) OVER (PARTITION BY id ORDER BY value)) lag,
NULLIF((LAG(value) OVER (PARTITION by id ORDER BY value)), 0) lag2
FROM bug1
ORDER BY id, value;
确实,在 PostgreSQL 9 上运行它会产生预期的输出:
id v lag lag2
1 1
1 2 1 1
1 3 2 2
2 1
2 2 1 1
2 3 2 2
但是,在 Redshift 上运行它会产生不正确的结果:
id v lag lag2
1 1 2
1 2 1 3
1 3 2
2 1 2
2 2 1 3
2 3 2
这是预期的吗?我asked on AWS forums但没有回复。
【问题讨论】:
【参考方案1】:这不是预期的;对我来说看起来像一个错误。如果它是有意的,那么使用 LEAD()
代替并反转 ORDER BY
子句,我们希望得到与原始 LAG()
查询完全相同的结果:
SELECT
id,
value,
(LEAD(value) OVER (PARTITION BY id ORDER BY value desc)) lead,
NULLIF((LEAD(value) OVER (PARTITION by id ORDER BY value desc)), 0) lead2
FROM bug1
ORDER BY id, value;
但这是我们得到的:
id | value | lead | lead2
----+-------+------+-------
1 | 1 | |
1 | 2 | 1 | 1
1 | 3 | 2 | 2
2 | 1 | |
2 | 2 | 1 | 1
2 | 3 | 2 | 2
【讨论】:
您是否在 Redshift 上验证并运行了它? 是的,刚刚在我的 Redshift 集群上运行了这个。我也可以重现您在LAG()
看到的错误。以上是关于NULLIF 在 Amazon Redshift 中产生不正确的输出?的主要内容,如果未能解决你的问题,请参考以下文章