什麼原因在測量實際表(維度建模的數據倉庫)NULL值的字段通常映射爲0?爲什麼NULL值在事實表中映射爲0?
4
A
回答
4
這取決於您正在建模的內容,但通常是避免執行聚合的複雜性。在許多情況下,爲了這些目的,將NULL
視爲0
是合理的。
例如,在給定時間段內訂購NULL
的客戶。或銷售人員NULL
的銷售收入(羞辱他!)。
15
雖然您已經接受了另一個答案,但我會說使用NULL實際上是一個更好的選擇,原因有兩個。
第一個原因是聚合在NULL存在時返回'正確'的答案(即用戶期望的答案),但在使用零時給出'錯誤'的答案。考慮從AVG()的結果在這兩個查詢:
-- with zero; gives 1.5
select SUM(measure), AVG(measure)
from
(
select 1.0 as 'measure'
union all
select 2.0
union all
select 3.0
union all
select 0
) dt
-- with null; gives 2
select SUM(measure), AVG(measure)
from
(
select 1.0 as 'measure'
union all
select 2.0
union all
select 3.0
union all
select null
) dt
如果我們假設該措施在這裏是「天製造項目的數量」和NULL表示仍在生產然後零一個項目給出了錯誤的回答。同樣的推理也適用於MIN()和MAX()。
第二個問題是,如果零是一個默認值,那麼如何區分作爲默認的零和作爲實際值的零?例如,考慮衡量「歐元運費」,其中NULL表示客戶自己拿起訂單,因此沒有運費,零表示訂單已免費送到客戶手中。您不能使用零來替換NULL,而不能完全改變數據的含義。您明顯可以爭辯說,區別應該從其他方面(例如運輸方法)明確,但會增加報告和理解數據的複雜性。
1
主要的原因是,從數據庫中空白或零對待空不同,儘管它們看起來像空白或零到人的眼睛。
這是一個link舊設計提示Ralph Kimball對同一主題。
This blogpost有關避免空值的措施,並提出了一些建議。
0
如果您打算在您的事實欄上做平均值,則應該使用NULL而不是0。這是唯一一次我相信NULLS在dwh事實或尺寸上是可以的
如果事實值是未知/遲到,則以NULL爲最好。
聚合函數suchs爲MIN,上NULLS MAX工作根本無視他們
(根據記錄拉爾夫·金博爾的插袋的人說這在他的過程中我意)在badf
with goodf as
(
select 1 x
union all
select null
union all
select 4
)
select sum(x) sumx,min(x) minx,max(x) maxx,avg(cast(x as float)) avgx
from goodf
with badf as
(
select 1 x
union all
select 0 /* unknown */
union all
select 4
)
select sum(x) sumx,min(x) minx,max(x) maxx,avg(cast(x as float)) avgx
from badf
高於平均水平出來不正確,因爲它使用未知值的零作爲字面0
相關問題
- 1. AutoMapper不會在Nullable屬性上映射Null值,爲什麼?
- 2. 爲什麼我的實體表映射在JPA Hibernate中?
- 3. 爲什麼MapReduce在映射步驟中將每個值都映射爲1?
- 4. 爲什麼`null> = 0 && null <= 0`但不是`null == 0`?
- 5. 爲什麼null投射?
- 6. 爲什麼發射(meta.id,NULL)
- 7. 可以將映射映射爲0嗎?
- 8. 爲什麼MapInheritedProperties()將我的實體映射到兩個表中?
- 9. 使用ValueInjecter映射爲null
- 10. 爲什麼要在控制器中映射實體
- 11. 爲什麼SqlParameter名稱/值構造函數將0視爲null?
- 12. 爲什麼在'dbo'上登錄映射
- 13. 爲什麼冒號在vim重映射?
- 14. 爲什麼不把C++映射實現爲try?
- 15. 爲什麼類/實體映射被Hibernate檢測爲重複?
- 16. 爲什麼MySQL的返回NULL 1000/0
- 17. 爲什麼`args [0] .Trim()== null`總是假?
- 18. 爲什麼從page_fan表返回null值?
- 19. 爲什麼select nullif(0,'')的輸出是NULL(預計爲0)?
- 20. Python - 爲什麼在映射兩個列表時爲什麼會縮短詞典?
- 21. 爲什麼count函數爲false返回1,爲NULL爲0
- 22. 爲什麼反射GetMethod返回null?
- 23. 爲什麼實體getter返回null而不是0?
- 24. 爲什麼Json.Net爲事件的值返回null?
- 25. 爲什麼Clojure將xml文檔表示爲哈希映射?
- 26. 爲什麼JavaScript中的「0 === -0」爲true?
- 27. 爲什麼ROW(@foostr,0)在@foostr爲varchar(max)時返回NULL?
- 28. glMapBufferRange僅映射4個值中的1個。爲什麼?
- 29. 休眠NULL值(XML映射)
- 30. 爲什麼Iam將此值作爲NULL
感謝您的回答。我在考慮用零代替會扭曲一些計算(例如COUNT)? – jrara
'COUNT'處理'NULL'的方式不同,儘管它仍然有意義。您可以顯式計算關係中「NULL」值的數量。你不能真正加起來(即'SUM')值爲'5 + 3 + 20 + NULL + 8'。 – Yuck
@Yuck,Aggregate SUM(measure_here)忽略空條目。 –