2

PostgreSQL 9.1.9 を使用しています。

私が取り組んでいるプロジェクトでは、その行が作成されたときにその情報が利用できなかったため、最新のレコードの一部に null 列があります。グループのメンバーに属する行の合計を一覧表示するビューがあります。現時点では、ビューには最新の列の合計が表示され、それらが最新の値である場合は null 値が使用されます。例えば、

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

6/19 のデータがないにもかかわらず、50 ではなく、150 が実際のグループの合計をより正確に表しています。だから、私はの出力が欲しい

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()使用可能な関数としてウィンドウ関数から見てきました。オラクルは、私が望むことを行うと信じているオプションをfirst_value()サポートしていることがわかりました( http://psoug.org/definition/FIRST_VALUE.htm)。私がリンクしたこのページによると、PL/SQLの機能について:ignore nullsfirst_value()

結果セットの最初の値が NULL の場合、IGNORE NULLS を指定しない限り、関数は NULL を返します。IGNORE NULLS パラメータを使用すると、FIRST_VALUE は結果セットで最初に見つかった null 以外の値を返します。(すべての値が null の場合、NULL が返されます。)

構文例: FIRST_VALUE(expression [INGORE NULLS]) OVER (analytic_clause)

しかし、PostgreSQLfirst_value()はそのようなオプションをサポートしていません。PostgreSqlでこれを行う方法はありますか? 前もって感謝します!

4

2 に答える 2

4

thisの postgres バリアントとしてカスタム集計を使用できますFIRST_VALUE(expression INGORE NULLS)。または、目的の動作で独自の集計を構築します。

于 2013-07-03T20:55:41.413 に答える