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
是的,NULL先排序,如果這是你的問題的要點。 'SELECT x = 1 UNION ALL SELECT NULL NULL ORDER BY x;'不知道你希望從這個特定查詢得到什麼結果,以及它們與你得到的結果有什麼不同,不知道如何評論...... –
我想你在這裏混淆了'OVER'和'GROUP BY' – JNK
因爲有1個與ID 1相關的空值,所以我期望結果中的'numnulls'列在ID爲1的每一行中包含1的值。 ,你實際上得到了一個混雜的包 - 0,0,1。這就像SQL Server只是假設null總是排序很低,並且不會檢查列的其餘部分,即使在排序方式不同時也是如此... –