小编Sal*_*ope的帖子

在SQL Server 2012中使用FIRST_VALUE()时出现意外结果

当我在手工构造的数据集上使用FIRST_VALUE时,我得到一个结果,当我在由左连接产生的数据集上使用它时,我得到了不同的结果 - 即使数据集在我看来包含完全相同的数据值.我用下面的简单数据集重现了这个问题.

有人能告诉我,如果我误解了什么吗?

此SQL生成预期结果,FIRST_VALUE为NULL且LAST_VALUE为30.

SELECT
  agroup,
  aval,
  FIRST_VALUE(aval) OVER (PARTITION BY agroup ORDER BY aval ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) fv,
  LAST_VALUE(aval) OVER (PARTITION BY agroup ORDER BY aval ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) lv
FROM
(
  SELECT 1 agroup, 10 aval
  UNION ALL SELECT 1, NULL
  UNION ALL SELECT 1, 30
) T
Run Code Online (Sandbox Code Playgroud)

此SQL使用LEFT JOIN导致与上面相同的数据集,但FIRST_VALUE似乎忽略NULL.

SELECT 
  agroup,
  aval,
  FIRST_VALUE(aval) OVER (PARTITION BY agroup ORDER BY aval ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) fv, …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server aggregate-functions window-functions sql-server-2012

24
推荐指数
1
解决办法
3480
查看次数