oracle查询检索按月和年分组的最高值的日期

时间:2016-03-04 05:07:16

标签: sql oracle date group-by greatest-n-per-group

数据看起来与此相似..

enter image description here

在这里,我需要通过按月和年分组来检索最高金额,但我无法检索最高金额的确切日期....

我尝试的最高金额代码是......

SELECT ACCT_ID                     AS ACCOUNT_ID,
  COUNT(TRANS_AMOUNT)              AS NUMBER_OF_TRANSACTION,
  Sum(Trans_Amount)                As Transaction_Amount,
  To_Char( Trans_Date, 'MON-YYYY') As Month_Date,
  Max(Trans_Amount)               As Highest
From Trans_Amt
group by ACCT_ID, To_Char( Trans_Date, 'MON-YYYY');

这有效但我无法在这里找回日期。如果我尝试的日期我得到"而不是变量组#34;错误...

2 个答案:

答案 0 :(得分:0)

按帐号和月份分组(我在月份级别使用了trunc)。 选择金额的最大值(金额)并使用keep dense_rank首先获取最大金额的日期:

SELECT 
    ACCT_ID   AS ACCOUNT_ID,
    trunc(Trans_Date, 'MM') As Month_Date,
    max(trans_date)  keep (dense_rank first order by trans_amount desc) as trans_date
    Max(Trans_Amount) As Highest
FROM Trans_Amt
GROUP BY 
   ACCT_ID, trunc(Trans_Date, 'MM');

答案 1 :(得分:0)

with t as (
  select 1000 ACCT_ID, to_date('11-JAN-2000', 'dd-MM-yyyy') TRANS_DATE, 201 TRANS_AMOUNT from dual union all
  select 1000, to_date('22-JAN-2000', 'dd-MM-yyyy'), 209 from dual union all
  select 1000, to_date('31-JAN-2000', 'dd-MM-yyyy'), 4504 from dual union all
  select 1000, to_date('10-FEB-2000', 'dd-MM-yyyy'), 487 from dual union all
  select 1001, to_date('10-FEB-2000', 'dd-MM-yyyy'), 4287 from dual union all
  select 1001, to_date('17-FEB-2000', 'dd-MM-yyyy'), 4501 from dual union all
  select 1001, to_date('22-FEB-2000', 'dd-MM-yyyy'), 1209 from dual union all
  select 1000, to_date('22-FEB-2000', 'dd-MM-yyyy'), 4550 from dual union all
  select 1001, to_date('23-FEB-2000', 'dd-MM-yyyy'), 120 from dual union all
  select 1001, to_date('26-FEB-2000', 'dd-MM-yyyy'), 245 from dual union all
  select 1000, to_date('28-FEB-2000', 'dd-MM-yyyy'), 4500 from dual union all
  select 1000, to_date('08-MAR-2000', 'dd-MM-yyyy'), 256 from dual union all
  select 1001, to_date('08-MAR-2000', 'dd-MM-yyyy'), 2561 from dual union all
  select 1000, to_date('24-MAR-2000', 'dd-MM-yyyy'), 987 from dual union all
  select 1001, to_date('24-MAR-2000', 'dd-MM-yyyy'), 75000 from dual union all
  select 1000, to_date('31-MAR-2000', 'dd-MM-yyyy'), 1100 from dual union all
  select 1001, to_date('31-MAR-2000', 'dd-MM-yyyy'), 11000 from dual union all
  select 1001, to_date('04-APR-2000', 'dd-MM-yyyy'), 4287 from dual union all
  select 1000, to_date('04-APR-2000', 'dd-MM-yyyy'), 487 from dual union all
  select 1001, to_date('12-APR-2000', 'dd-MM-yyyy'), 1209 from dual union all
  select 1001, to_date('14-APR-2000', 'dd-MM-yyyy'), 1092 from dual union all
  select 1001, to_date('20-APR-2000', 'dd-MM-yyyy'), 1245 from dual union all
  select 1000, to_date('20-APR-2000', 'dd-MM-yyyy'), 7500 from dual union all
  select 1000, to_date('22-APR-2000', 'dd-MM-yyyy'), 1205 from dual union all
  select 1000, to_date('26-APR-2000', 'dd-MM-yyyy'), 245 from dual
)
select
  *
from
  t t
where
  not exists(
    select
      *
    from
      t n
    where
      trunc(t.TRANS_DATE, 'mm') = trunc(n.TRANS_DATE, 'mm')
      and n.TRANS_AMOUNT > t.TRANS_AMOUNT
      and t.ACCT_ID = n.ACCT_ID
  )
order by
  t.TRANS_DATE, t.ACCT_ID

输出

enter image description here