2017-11-28 9 views
0

mariadb/mysqlでは、次の方法で変数を使用してselect文で計算を実行できます。この単純な例では、日付の範囲と変数を使用して、単純な開始残高と終了残高を計算し、毎日10の支払いを行います。SELECT文でのMARIADB変数POSTGRES等価

with RECURSIVE dates as (
select '2017-11-01' as `dt` 
union all 
select adddate(dt, INTERVAL 1 DAY) 
from dates 
where dt < CURDATE() 
) 

select 
@vardate:=d.dt 
, @openbal 
, @payment:= 10 
, @closebal:= @[email protected] 
, @openbal:[email protected] 
from dates d; 

私はselect文でその場で簡単な計算を実行することができますこの技術を使用して

╔══════════════╦════════════╦═══════════════╦═════════════╗ 
║ "ac_date" ║ "open_bal" ║ "trans_total" ║ "close_bal" ║ 
╠══════════════╬════════════╬═══════════════╬═════════════╣ 
║ "2017-11-01" ║ "0"  ║ "10"   ║ "10"  ║ 
║ "2017-11-02" ║ "10"  ║ "10"   ║ "20"  ║ 
║ "2017-11-03" ║ "20"  ║ "10"   ║ "30"  ║ 
... 

....結果が得られます。私の質問は、PL/pgSQL関数でこのように変数を使用することは可能ですか、それとも私が見落としている別の方法がありますか?

+0

あなたはPostgresの変数を必要としません。あなたは単にウィンドウ関数を使うことができます(そして、いつMySQLで '再帰的に'を使うことができますか?) –

+0

ウィンドウ関数を使って質問の結果を得る方法を教えてください。私は概念的に役立つかもしれないと思う。私が働いているクエリは、毎日の関心を計算するローンスケジュールを作成し、広範囲に記述された手法を使用します。 – ojf

+0

出力の作成方法を説明する必要があります。お支払いは「1」に設定されていますが、出力には「10」の増加が表示されます。 Alosどこから 'trans_total'が来たのですか?私は変数から導き出すことはできません –

答えて

1

私はその文がMariaDBにどのように動作するか完全にわからないが、これは同じことをしているようだ。一般的には

with vars (openbal, payment) as (
    values (0, 10) 
), balance as (
    select t.dt::date as ac_date, 
     openbal, 
     payment, 
     sum(payment) over (order by t.dt) as close_bal 
    from vars, 
     generate_series(date '2017-11-01', current_date, interval '1' day) as t(dt) 
) 
select ac_date, 
     openbal + lag(close_bal) over (order by ac_date) as open_bal, 
     payment, 
     close_bal 
from balance; 

あなたはSQLでsum() over (order by ...)を使用累計を取得します。前の行の値にアクセスするには、lag()関数を使用します。

ウィンドウ関数をネストできないため、2つのCTEが必要です。

行のリストを生成するには、Postgrseでgenerate_series()を使用します。