| 日 | 增長率 | 目標 |
|---|---|---|
| 1 | 1.2 | X |
| 2 | 1.3 | X |
| 3 | 1.4 | x = 909.09/1.4 |
| 4 | 1.2 | x = 1000/1.1 = 909.09 |
| 5 | 1.1 | 1000 |
所以我試圖根據 SQL 中每一天的給定增長率設定一天的目標。我們知道在本周末/月末,目標是達到 1000。
鑒于我們知道最終結果,撰寫遞回(可能)函式來填充目標值 (x) 的方法是什么。
如果您能帶我了解您是如何得到答案的,那么我也將非常感激,以便我學習。謝謝!
使用 postgress fyi
uj5u.com熱心網友回復:
您可以使用對數恒等式,以便可以輕松地對增長因子求和(對數的屬性):
with data as (
select *,
max("target") over () / exp(sum(ln(growth_rate))
over (order by day desc)) as tgt
from T
)
select day, growth_rate,
coalesce(lead(tgt) over (order by day desc), target) as target
from data
order by day
不確定以下哪個最干凈:
with data as (
select day,
max(target) over () as target,
lead(growth_rate) over (order by day) as growth_rate
from T
)
select day, growth_rate,
target / exp(sum(ln(growth_rate)) over (order by day desc)) as target
from data
order by day
https://dbfiddle.uk/?rdbms=postgres_10&fiddle=c9bbef6bb8192b5a8cff843ab6a009fc
uj5u.com熱心網友回復:
您的問題是視窗函式的典型用例。但是乘法或除法不存在內置視窗函式,因此您可以使用sum()聚合按照@shawnt00 的答案進行操作,也可以根據除法運算子創建自己的聚合:
CREATE OR REPLACE FUNCTION division (x anyelement, y anyelement, z anyelement)
RETURNS anyelement LANGUAGE sql AS $$ SELECT COALESCE(x,y)/z $$ ;
CREATE OR REPLACE AGGREGATE division_agg (x anyelement, z anyelement)
(sfunc = division, stype = anyelement) ;
然后你可以division_agg在查詢中使用你的新聚合:
SELECT day, growth_rate
, COALESCE(division_agg(target, growth_rate) OVER (ORDER BY day DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), target)
FROM test
ORDER BY day
的division_agg視窗函式將所述初始target值,其對應于最高的時間,因為的ORDER BY day DESC由所有依次子句growth_rate關聯到當前行,即,視窗的值的所有具有最高一天的行中,除了與其中最高天的行視窗是空的,因此division_agg回傳NULL由函式替換的target值COALESCE()。
請參閱dbfiddle 中的完整演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/391466.html
標籤:sql PostgreSQL的
