2017-05-27 113 views
0

假設有是包含以下數據的表格demoa如何用平均值替換空值而不使用組?

date  a   b   c 
2017-05-22 1   6   10 
2017-05-23 2   7   11 
2017-05-24 3   8   12 
2017-05-25 4   9   null 
2017-05-26 5   null  null 
2017-05-27 null  null  null 

我想和其對應的列的平均值來替換null值:

date  a   b   c 
2017-05-22 1   6   10 
2017-05-23 2   7   11 
2017-05-24 3   8   12 
2017-05-25 4   9   11 
2017-05-26 5   7.5   11 
2017-05-27 3   7.5   11 

我試圖nvlavg(),但這需要每列group by,並且不能刪除null值:

select 
    date, 
    nvl(a,avg(a)), 
    nvl(b,avg(b)), 
    nvl(c,avg(c)) 
from damoa 
group by date,a,b,c; 

任何幫助表示讚賞。

回答

0

的Windows功能 - avg(...) over()

select dt 
     ,coalesce (a,avg(a) over()) as a 
     ,coalesce (b,avg(b) over()) as b 
     ,coalesce (c,avg(c) over()) as c 

from demoa  

+------------+-----+-----+------+ 
|  dt  | a | b | c | 
+------------+-----+-----+------+ 
| 2017-05-22 | 1.0 | 6.0 | 10.0 | 
| 2017-05-23 | 2.0 | 7.0 | 11.0 | 
| 2017-05-24 | 3.0 | 8.0 | 12.0 | 
| 2017-05-25 | 4.0 | 9.0 | 11.0 | 
| 2017-05-26 | 5.0 | 7.5 | 11.0 | 
| 2017-05-27 | 3.0 | 7.5 | 11.0 | 
+------------+-----+-----+------+ 
+0

謝謝!但是我仍然困惑爲什麼avg()需要'group by',而avg()over()不需要? – superz

+0

你必須學習windows功能。我建議你從'row_number'開始。 –

相關問題