集团通过月份和年份,但包括前一天

问题描述 投票:0回答:2

我有一个像下面的数据的数据库,我通过这两个月份,年份和上月的最后一天尝试对数据进行分组。它并不总是T-1天。

已经通过分组年份和月份的数据,但我坚持如何包括前一个月的在此查询的最后一天。确信这是不是一个更好的方式GROUP BY ID,并得到每个月的最大日期。希望得到任何帮助。谢谢!

  select 
    ID,
    last_day(to_date('01' || to_char(DATA_DATE,'mm') || to_char(DATA_DATE,'yyyy'),'ddmmyyyy')) as DATA_DATE,
    SUM(GS_PX_AMT)
  from xxx
  group by ID, last_day(to_date('01' || to_char(DATA_DATE,'mm') || to_char(DATA_DATE,'yyyy'),'ddmmyyyy'))

data

sql oracle
2个回答
2
投票

如果你想包括一个组在一个月的最后一天,然后用lead()

select id,
       to_char(next_data_date, 'YYYY-MM') as yyyymm,
       sum(GS_PX_AMT)
from (select xxx.*,
             lead(data_date, 1, data_date) over (partition by id order by data_date) as next_data_date
      from xxx
     ) x
group by id, to_char(next_data_date, 'YYYY-MM');

如果您要包括的最后日期和双数,那么你也可以使用窗口函数:

select id,
       to_char(data_date, 'YYYY-MM') as yyyymm,
       ( sum(GS_PX_AMT) +
         sum(case when yyyymm_seqnum = 1 then prev_amt else 0
             end)
       ) as double_counted_sum
from (select xxx.*,
             lag(GS_PX_AMT) over (partition by id order by data_date) as prev_amt,
             row_number() over (partition by id, to_char(next_data_date, 'YYYY-MM') order data_date) as yyyymm_seqnum
      from xxx
     ) x
group by id, to_char(data_date, 'YYYY-MM');

0
投票
select 
    ID,
    last_day(add_months(data_date,-1)) as DATA_DATE,
    SUM(GS_PX_AMT)
  from xxx
  group by ID, last_day(add_months(data_date,-1))
© www.soinside.com 2019 - 2024. All rights reserved.