SELECT记录FROM amount_history WHERE amount1在过去3年中是l< = max amount2

时间:2017-01-06 19:52:18

标签: sql oracle

我知道基本的SQL,但我试图想出一个超出我的查询。

AMOUNT_HISTORY表是这样的

enter image description here

我可以为生效日期添加一个输入参数,比如effectiveDate。

过去3年RefNo 1的最高金额1是12,000,这是< =有效日期的金额2 - 很好。

过去3年RefNo 2的最高金额1是22,000,其>比生效日期的金额2 - 在这种情况下我需要选择RefNo。

请注意日期会更进一步,因此需要最后3个日期标准。只有有效日期的周年日期。通常我会添加到目前为止我开发的查询,但是我没有比简单的Select From Where更进一步,所以没有太多进展。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

首先,您只需要选择日期介于“生效日期减去两年”和“生效日期”之间的行。最好在WHERE子句中使用between条件,使用add_months()从生效日期减去两年。注意 - 我使用dt作为列名( date 在Oracle中保留,不应用作标识符);我将生效日期作为绑定变量传递。

然后,从剩余的行中按refno分组,并在生效日期将max(amount1)amount2进行比较。这是组级别的比较,而不是单个行级别的比较,因此它位于HAVING子句中,而不是WHERE子句中。

最后,生效日期的amount2是行级别,而不是组级别;所以我们需要一个小技巧。我使用“条件最大值” - max()函数应用于表达式,当日期为生效日期时为amount2,而其他日期为nullcase表达式非常适合。

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年间隔的标准