简体   繁体   English

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

[英]oracle query to retrieve the date of the highest value which are grouped by month and year

Data looks similar to this.. 数据与此类似。

在此处输入图片说明

Here I need to retrieve the highest amount by grouping them by month and year but I couldn't retrieve the exact date of the highest amount.... 在这里,我需要通过按月和年对它们进行分组来检索最高金额,但是我无法获取最高金额的确切日期。

The code I tried for the highest amount is ... 我尝试的最高金额的代码是...

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');

And this worked but I could not retrieve the date here. 这可行,但是我无法在此处检索日期。 If I try for the date I get "not a group by variable" error ... 如果我尝试输入日期,则会收到“不是按变量分组”错误...

Group by account and month(I used trunc at month level). 按帐户和月份分组(我在月份级别使用了trunc)。 Select max(amount) for amount and use keep dense_rank first to get the date of maximum amount: 选择max(amount)作为数量,并首先使用keep density_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');
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

Output 输出量

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM