web-dev-qa-db-ja.com

Postgresを使用して配列に値を累積する

現在、私はこのクエリを持っています:

select 
    sum(case when my_table.property_type = 'FLAT' then my_table.price else 0 end) as Flat_Current_Asking_Price,
    sum(case when my_table.property_type_mapped = 'SEMIDETACHED' then my_table.price else 0 end) as Semidetached_Current_Asking_Price
from 
    my_table;

だからmy_tableには次の値があります。

property_type | price
--------------+-------
FLAT          | 5000
SEMIDETACHED  | 9000
FLAT          | 6000

クエリは次を返します:

Flat_Current_Asking_Price | Semidetached_Current_Asking_Price
--------------------------+-----------------------------------
11000                     | 9000

sumを置換して配列に値を累積して取得するにはどうすればよいですか。

Flat_Current_Asking_Price | Semidetached_Current_Asking_Price
--------------------------+-----------------------------------
{5000, 6000}              | {9000}

3
Randomize

PostggreSQLのバージョンが9.4以降の場合は、 FILTER 句を使用します。

select
    array_agg(my_table.price) filter(where my_table.property_type = 'FLAT' ) as Flat_Current_Asking_Price,
    array_agg(my_table.price) filter(where my_table.property_type = 'SEMIDETACHED') as Semidetached_Current_Asking_Price
from 
    my_table;
4
Abelisto

配列が必要な場合は、SUMの代わりにarray_aggを使用します。

SELECT
    array_agg(case when my_table.property_type = 'FLAT'         then my_table.price end) as Flat_Current_Asking_Price,
    array_agg(case when my_table.property_type = 'SEMIDETACHED' then my_table.price end) as Semidetached_Current_Asking_Price
FROM 
    my_table;
 flat_current_asking_price | semidetached_current_asking_price 
:--------------------- :-------------------------------- 
 {5000、NULL、6000} | {NULL、9000、NULL} 

Nullを削除したい場合は、代わりに小さめのトリックを使用します(array_to_stringはnullを削除します)。

SELECT
    string_to_array(array_to_string(array_agg(case when my_table.property_type = 'FLAT'         then my_table.price end), '|'), '|') as Flat_Current_Asking_Price,
    string_to_array(array_to_string(array_agg(case when my_table.property_type = 'SEMIDETACHED' then my_table.price end), '|'), '|') as Semidetached_Current_Asking_Price
FROM 
    my_table;
 flat_current_asking_price | semidetached_current_asking_price 
:------------------------ | :-------------------------------- 
 {5000,6000} | {9000} 

dbfiddle ---(ここ


補遺

Abelistoのコメントによると、array_removeを使用することもできます:

SELECT
    array_remove(array_agg(case when my_table.property_type = 'FLAT'         then my_table.price end), NULL) as Flat_Current_Asking_Price,
    array_remove(array_agg(case when my_table.property_type = 'SEMIDETACHED' then my_table.price end), NULL) as Semidetached_Current_Asking_Price
FROM 
    my_table;

dbfiddle ここ

0
joanolo