NULLIF 在 Amazon Redshift 中产生不正确的输出?

Posted

技术标签:

【中文标题】NULLIF 在 Amazon Redshift 中产生不正确的输出?【英文标题】:NULLIF produces incorrect output in Amazon Redshift? 【发布时间】:2016-07-26 15:16:08 【问题描述】:

以下代码应为列laglag2 生成相同的值:

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 中产生不正确的输出?的主要内容,如果未能解决你的问题,请参考以下文章

amazon-redshift 中的 CONCAT 函数

Amazon Redshift 按特定值排序

在 Amazon Redshift 中按日期透视查询

不使用 jdbc 驱动程序查询 Amazon Redshift

与 Amazon Redshift 同步

有用的 Amazon Redshift SQL 用户定义函数的任何示例?