【问题标题】:Effect of QUALIFY SUM(1) OVER (PARTITION BY ROWS UNBOUNDED PRECEDING)=1?QUALIFY SUM(1) OVER (PARTITION BY BY ROWS UNBOUNDED PRECEDING)=1 的影响?
【发布时间】:2017-07-12 18:03:20
【问题描述】:

我有两个几乎相似的查询:

SELECT *
FROM table
QUALIFY SUM(1) OVER (PARTITION BY id_field ROWS UNBOUNDED PRECEDING) = 1;

SELECT *
FROM table
QUALIFY SUM(1) OVER (PARTITION BY id_field) = 1;

我无法解释为什么ROWS UNBOUNDED PRECEDING 对查询有任何影响。

在我看来,两个查询似乎会产生相同的结果,因为函数 SUM 没有使用我表的任何列,因此 ROWS UNBOUNDED PRECEDING 不会影响 SUM。

但实际上,当我执行第一个查询时,它产生的结果比第二个查询多。

这两个查询有什么区别,ROWS UNBOUNDED PRECEDING 对这个特定的 QUALIFY 有什么影响?

【问题讨论】:

  • 你到底想做什么?
  • ROWS UNBOUNDED PRECEDING 没有order by?
  • 我试图根据另一列的最近日期为每个不同的 id_field 获取一行。原始查询有一个 ORDER BY 日期字段,但我在问题中删除了它,以便专注于为什么我的查询结果中的行数不同。
  • 只需将 SUM 移动到 Select 子句中,您就会看到计算结果。

标签: sql teradata window-functions


【解决方案1】:

第一个查询返回每个分区的第一行。
它有一个“累计”逻辑。
第 1 行的总和为 1,第 2 - 2,第 3 - 3 等。

第二个查询从只有一行的分区返回行。


这将为您提供每个 id_field 的最后一条记录

SELECT   *
FROM     table
QUALIFY  row_number() OVER (PARTITION BY id_field order by ... desc) = 1
;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多