QUALIFY SUM(1) OVER (PARTITION BY ROWS UNBOUNDED PRECEDING)=1 的影响?
Effect of QUALIFY SUM(1) OVER (PARTITION BY ROWS UNBOUNDED PRECEDING)=1?
我有两个几乎相似的查询:
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 没有使用我的 table 的任何列,因此 ROWS UNBOUNDED PRECEDING 不会影响 SUM。
但实际上,当我执行它时,第一个查询比第二个查询产生更多行。
两个查询之间有什么区别,ROWS UNBOUNDED PRECEDING 对此特定 QUALIFY 有什么影响?
第一个查询 return 是每个分区的第一行。
它有一个 "running total" 逻辑。
第一行的总和为 1,第二行的总和为 2,第三行的总和为 3,依此类推。
第 2 个查询 return 行来自只有一行的分区。
这将为您提供每个 id_field
的最后一条记录
SELECT *
FROM table
QUALIFY row_number() OVER (PARTITION BY id_field order by ... desc) = 1
;
我有两个几乎相似的查询:
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 没有使用我的 table 的任何列,因此 ROWS UNBOUNDED PRECEDING 不会影响 SUM。
但实际上,当我执行它时,第一个查询比第二个查询产生更多行。
两个查询之间有什么区别,ROWS UNBOUNDED PRECEDING 对此特定 QUALIFY 有什么影响?
第一个查询 return 是每个分区的第一行。
它有一个 "running total" 逻辑。
第一行的总和为 1,第二行的总和为 2,第三行的总和为 3,依此类推。
第 2 个查询 return 行来自只有一行的分区。
这将为您提供每个 id_field
的最后一条记录SELECT *
FROM table
QUALIFY row_number() OVER (PARTITION BY id_field order by ... desc) = 1
;