2013-07-03 23 views
2

我正在使用PostgreSQL 9.1.9。最近的非空列(帶有「忽略空值」的窗口函數)的總和

在我正在處理的項目中,某些最近的記錄具有空列,因爲創建該行時該信息不可用。我有一個視圖,列出屬於組成員的行的總和。截至目前,該視圖顯示最近列的總和,如果這些列是最近的值,則使用空值。例如,

table1 

group_name | member 
------------------- 
group1  | Andy 
group1  | Bob 

table2 

name | stat_date | col1 | col2 | col 3 
-------------------------------------- 
Andy | 6/19/13 | null | 1 |  2 
Andy | 6/18/13 | 100 | 3 |  5 
Bob | 6/19/13 | 50 | 9 | 12 
Bob | 6/18/13 | 111 | 31 | 51 

-- creating view would be something like this... 
create view v_grouped as 
select table1.group_name, stat_date, 
sum(col1) as col1_sum, sum(col2) as col2_sum, sum(col3) as col3_sum 
from table1 
join table2 on table1.member = table2.name 
group by table1.group_name, table2.stat_date; 

當前視圖看起來像這樣:

group_name | stat_date | col1_sum | col2_sum | col3_sum 
------------------------------------------------------- 
group1  | 6/19/13 |  50 |  10 |  14 
group2  | 6/18/13 |  211 |  34 |  56 

代替50,150將是實際組總是什麼仔細表示,儘管缺乏數據的6/19。所以,我想的

group_name | stat_date | col1_sum | col2_sum | col3_sum 
------------------------------------------------------- 
group1  | 6/19/13 |  150 |  10 |  14 
group2  | 6/18/13 |  211 |  34 |  56 

輸出我已經從窗口功能看first_value()作爲一個可能的功能使用。我發現Oracle的first_value()支持ignore nulls選項,我相信它會做我想做的(http://psoug.org/definition/FIRST_VALUE.htm)。根據這一頁我聯繫,關於PL/SQL的first_value()功能:

如果在結果集中的第一個值是NULL,則除非指定IGNORE NULLS函數返回NULL。 如果使用IGNORE NULLS參數,則FIRST_VALUE將返回結果集中的第一個非空值。 (如果所有 值爲null,則它會返回NULL。)

語法示例:FIRST_VALUE(表達式[則會忽略NULLS])OVER(analytic_clause)

但PostgreSQL的first_value()不支持這樣的選擇。有沒有辦法在PostgreSql中做到這一點?先謝謝你!

+1

向我們展示sql – digitaljoel

+0

我剛剛包含了與視圖一起使用的sql腳本。謝謝。 –

+0

我不明白解釋。你一直在寫「最近的專欄」。你是否及時添加專欄? 「最近的專欄」是什麼意思? – 2013-07-03 21:07:12

回答

3

您可以使用this自定義聚合爲FIRST_VALUE(expression INGORE NULLS) Postgres的變種。或者用你想要的行爲建立自己的聚合。

+0

我認爲這是正確的答案,但與MySQL版本相比,該函數耗時太長,所以我放棄了這一點。 (將等到有更多的窗口功能添加到postgres !!!) –

+0

我只是想補充,雖然這個解決方案的作品,它不像窗口功能一樣快! –

0

這是你想要描述的嗎?

SELECT sum(col1), sum(col2), sum(col3) FROM table2 WHERE col1 IS NOT NULL 

(雖然我省略了表1的連接;這是讀者的練習)

+0

這有點像我想要的 - 如果col1爲null,那麼我希望視圖從col1中獲取col1值col1不爲null的最近行,並與其他col1值(最近非空值)相加。 –

+0

即使col1不可用,我仍然想總結col2和col3的最新非空值,而不管col1是否爲空。 –