我知道基本的SQL,但我试图想出一个超出我的查询。
AMOUNT_HISTORY表是这样的
我可以为生效日期添加一个输入参数,比如effectiveDate。
过去3年RefNo 1的最高金额1是12,000,这是< =有效日期的金额2 - 很好。
过去3年RefNo 2的最高金额1是22,000,其>比生效日期的金额2 - 在这种情况下我需要选择RefNo。
请注意日期会更进一步,因此需要最后3个日期标准。只有有效日期的周年日期。通常我会添加到目前为止我开发的查询,但是我没有比简单的Select From Where更进一步,所以没有太多进展。任何帮助表示赞赏。
答案 0 :(得分:0)
首先,您只需要选择日期介于“生效日期减去两年”和“生效日期”之间的行。最好在WHERE
子句中使用between
条件,使用add_months()
从生效日期减去两年。注意 - 我使用dt
作为列名( date
在Oracle中保留,不应用作标识符);我将生效日期作为绑定变量传递。
然后,从剩余的行中按refno
分组,并在生效日期将max(amount1)
与amount2
进行比较。这是组级别的比较,而不是单个行级别的比较,因此它位于HAVING
子句中,而不是WHERE
子句中。
最后,生效日期的amount2
是行级别,而不是组级别;所以我们需要一个小技巧。我使用“条件最大值” - max()
函数应用于表达式,当日期为生效日期时为amount2
,而其他日期为null
。 case
表达式非常适合。
with
test_data ( refno, dt, amount1, amount2 ) as (
select 1, date '2017-01-01', 12000, 12000 from dual union all
select 1, date '2016-01-01', 11000, null from dual union all
select 1, date '2015-01-01', 10500, null from dual union all
select 2, date '2017-01-01', 20000, 10000 from dual union all
select 2, date '2016-01-01', 21000, null from dual union all
select 2, date '2015-01-01', 22000, null from dual
)
-- End of test data (not part of the solution). SQL query begins below this line.
select refno, max(case when dt = :effective_date then amount2 end) as amount2
from test_data
where dt between add_months(:effective_date, -24) and :efffective_date
group by refno
having max(amount1) > max(case when dt = :effective_date then amount2 end)
;
REFNO AMOUNT2
----- -------
2 10000
答案 1 :(得分:-2)
我无法为您提供直接答案,但肯定会帮助您获得正确答案。
所以,基本上你需要学习 - GROUP BY和聚合函数 - http://www.w3schools.com/sql/sql_groupby.asp。
分组依据将结果按ref no分组,然后使用聚合函数MAX
DATE_ADD - http://www.w3schools.com/sql/func_date_add.asp sql query for getting data for last 3 months
使用DATE_ADD添加过去3年间隔的标准