Группировать по месяцам и годам, но включать предыдущий день - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть база данных с данными, подобными приведенным ниже, и я пытаюсь сгруппировать данные по месяцу, году и последнему дню предыдущего месяца.Это не всегда день Т-1.

Уже сгруппировали данные по месяцам и годам, но я не могу понять, как включить в этот запрос последний день предыдущего месяца.Уверен, что есть лучший способ вместо группировки по идентификатору и получить максимальную дату для каждого месяца.Буду признателен за любую помощь.Спасибо!

  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

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Если вы хотите включить последний день месяца в группу next , используйте 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 голосов
/ 04 февраля 2019
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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...