2014-01-17 20 views
1

下將無法正常窗口內數空...窗口函數假定null排序低 - 預期行爲?

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

是的,NULL先排序,如果這是你的問題的要點。 'SELECT x = 1 UNION ALL SELECT NULL NULL ORDER BY x;'不知道你希望從這個特定查詢得到什麼結果,以及它們與你得到的結果有什麼不同,不知道如何評論...... –

+0

我想你在這裏混淆了'OVER'和'GROUP BY' – JNK

+0

因爲有1個與ID 1相關的空值,所以我期望結果中的'numnulls'列在ID爲1的每一行中包含1的值。 ,你實際上得到了一個混雜的包 - 0,0,1。這就像SQL Server只是假設null總是排序很低,並且不會檢查列的其餘部分,即使在排序方式不同時也是如此... –

回答

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 

,因爲你使用​​3210它不能正確分區這是你的數是關閉的。