窗口函数假设null对低预期行为进行排序?

时间:2014-01-17 19:44:55

标签: sql sql-server sql-server-2012

以下内容无法正确计算窗口中的空值...

select *,
    sum(case when value is null then 1 else 0 end)
        over(partition by id
            order by coalesce(value,9999999)) as NumNulls,
    row_number()
        over(partition by id
            order by coalesce(value,9999999)) as RN
from temp

显然,使用rows between unbounded preceding and unbounded following可以解决问题,所以这不是什么大问题。但是,鉴于我对SQL的理解,我不会期望这个结果。我是否错过了语言的细节,或者这是出乎意料的行为?

这是一个SQL小提琴:http://sqlfiddle.com/#!6/98285/3

1 个答案:

答案 0 :(得分:0)

要达到预期效果,您需要

 SELECT *
   ,SUM(CASE WHEN value IS NULL THEN 1 ELSE 0
        END) OVER ( PARTITION BY id ORDER BY value ) AS NumNulls
   ,ROW_NUMBER() OVER ( PARTITION BY id ORDER BY value) AS RN
FROM #temp

因为您使用了coalesce,因此无法正确分区,因此您的计数已关闭。