Sql 按月份和年份分组,但包括前一天

Sql 按月份和年份分组,但包括前一天,sql,oracle,Sql,Oracle,我有一个包含如下数据的数据库,我试图按月份、年份和上个月的最后一天对数据进行分组。这并不总是T-1天 已经按月份和年份对数据进行了分组,但我仍无法确定如何在此查询中包括上个月的最后一天。我确信有更好的方法代替按id分组,并获得每个月的最长日期。非常感谢您的帮助。谢谢 select ID, last_day(to_date('01' || to_char(DATA_DATE,'mm') || to_char(DATA_DATE,'yyyy'),'ddmmyyyy')) as

我有一个包含如下数据的数据库,我试图按月份、年份和上个月的最后一天对数据进行分组。这并不总是T-1天

已经按月份和年份对数据进行了分组,但我仍无法确定如何在此查询中包括上个月的最后一天。我确信有更好的方法代替按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'))

如果您想在下一组中包括一个月的最后一天,请使用
lead()


如果要包括最后一个日期并重复计算,则还可以使用窗口功能:

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

如果要在下一组中包括一个月的最后一天,请使用
lead()


如果要包括最后一个日期并重复计算,则还可以使用窗口功能:

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

请详细说明。你想把一个月的最后一天分成两组吗?还是分配到下个月?简单的示例数据和所需的结果(作为文本表)非常有用。还有,每天只有一排吗?如果没有,是否所有记录都已记录?将一个月的最后一天与下一个月一起分组。i、 e 2018年3月30日,包括全部4月数据。请详细说明。你想把一个月的最后一天分成两组吗?还是分配到下个月?简单的示例数据和所需的结果(作为文本表)非常有用。还有,每天只有一排吗?如果没有,是否所有记录都已记录?将一个月的最后一天与下一个月一起分组。i、 e 2018年3月30日,所有的Apr数据。这正是我想要的。非常感谢!正是我要找的。非常感谢!虽然此代码可以回答问题,但提供有关代码回答问题的原因和/或方式的额外上下文可以提高其长期价值。这也有助于避免你的答案被否决或被标记为低质量。请参阅。虽然此代码可以回答此问题,但提供有关代码回答此问题的原因和/或方式的其他上下文可提高其长期价值。这也有助于避免你的答案被否决或被标记为低质量。看见
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');