2017-03-06 63 views
0

我試圖創建基於表格的視圖。我想獲得一組現有的tax_id_no行,每行都有最新的信息。所以我按時間戳降序排列。但是,每個tax_id_no可以有多行,並不是每行都會有所有的信息。所以我想爲每一列獲得第一個有效的信息。現在我得到了這個:爲PostgreSQL中的多列和不同行選擇第一個非空值

SELECT * FROM 
(
SELECT DISTINCT ON (store_id, tax_id_no) 
    event_id, 
    event_tstamp, 
    owner_id, 
    store_id, 
    tax_id_no, 
    first_value(year_built) OVER (ORDER BY year_built IS NULL, event_tstamp) AS year_built, --New 
    first_value(roof_replaced_year) OVER (ORDER BY roof_replaced_year IS NULL, event_tstamp) AS roof_replaced_year, --New 
    first_value(number_of_rooms) OVER (ORDER BY number_of_rooms IS NULL, event_tstamp) AS number_of_rooms, --New 

FROM MySchema.Event 
WHERE tax_id_no IS NOT NULL AND tax_id_no != '' 
order by store_id, tax_id_no, event_tstamp DESC 
) t1 
WHERE owner_id IS NOT NULL OR owner_id != ''; 

雖然這是獲得每行相同的第一個有效信息。因此,與其讓這樣的結果,這就是我想要的:

event_id event_tstamp owner_id store_id tax_id_no year_built roof_replaced_year number_of_rooms 
04   2016-05-12  123   02   12345  1996  2009    6 
05   2017-02-02  245   02   23456  1970  1999    8 
08   2017-03-03  578   03   34567  2002  2016    10 

我得到這個,這都在尋找相同的first_value列行:

event_id event_tstamp owner_id store_id tax_id_no year_built roof_replaced_year number_of_rooms 
04   2016-05-12  123   02   12345  1996  2009    6 
05   2017-02-02  245   02   23456  1996  2009    6 
08   2017-03-03  578   03   34567  1996  2009    6 

是否有可能爲每一行選擇不同的first_value?我想我可以在同一張表中做多種選擇的連接,但我不確定這會實際給我每行的唯一值,而不是再次遇到同樣的問題。此類查詢的時間也很長,到目前爲止,這些查詢的代價非常昂貴。

+1

通過在窗函數的'順序by'表達的前立即tax_id_no'添加'分區。 – systemjack

+0

@systemjack謝謝,這工作。如果你將它作爲答案發布,我會接受它。 –

回答

1

在應用函數之前,可以在窗口函數中使用分區對行進行分組。這將爲每個分區生成不同的結果。

例如:

first_value(number_of_rooms) OVER (
    PARTION BY tax_id_no 
    ORDER BY number_of_rooms IS NULL, event_tstamp 
) AS number_of_rooms, 
相關問題