我有一个看起来像这样的 postgres 表:
proposal_id | nih_budget_start | nih_budget_end | nsf_start_date | nsf_end_date | award_amount
proposal_A | 03/01/2000 | 12/31/2000 | | | 10,000
proposal_B | | | 08/01/2005 | 07/31/2009 | 5,000,000
proposal_C | 06/27/2012 | 11/17/2013 | | | 420,000
日期具有date
数据类型。
我想创建一个视图,告诉我提案每年得到资助,以及平均奖励金额是多少。因此,视图可能看起来像这样(选项 1):
proposal_id | start_year | end_year | average_award
proposal_A | 2000 | 2000 | 10,000
proposal_B | 2005 | 2009 | 1,000,000
proposal_C | 2012 | 2013 | 210,000
或者——甚至更好——这个(选项 2):
proposal_id | year | award
proposal_A | 2000 | 10,000
proposal_B | 2005 | 1,000,000
proposal_B | 2006 | 1,000,000
proposal_B | 2007 | 1,000,000
proposal_B | 2008 | 1,000,000
proposal_B | 2009 | 1,000,000
proposal_C | 2012 | 210,000
proposal_C | 2023 | 210,000
此外,将奖励金额按比例分配给部分年度资金可能会很好,但这并不是完全必要的。
根据下面建议的答案,我目前正在这样做,这似乎可以按预期工作以获得上面的选项 1:
CREATE VIEW award_per_year AS
select t1.proposal_id,t1.START_DATE,t1.END_DATE,
(t1.adjusted_award_amount/((t1.END_DATE - t1.START_DATE) + 1.)) avg_award
from
(select t2.proposal_id,
(extract(year from START_DATE)) START_DATE,
(extract(year from END_DATE)) END_DATE,
t2.adjusted_award_amount from
(select proposal_id,
case when nih_budget_start is not NULL then nih_budget_start else nsf_start_date end start_date,
case when nih_budget_end is not NULL then nih_budget_end else nsf_end_date end end_date,
adjusted_award_amount from proposal)t2)t1