Sql 按月份和年份分组,但包括前一天
我有一个包含如下数据的数据库,我试图按月份、年份和上个月的最后一天对数据进行分组。这并不总是T-1天 已经按月份和年份对数据进行了分组,但我仍无法确定如何在此查询中包括上个月的最后一天。我确信有更好的方法代替按id分组,并获得每个月的最长日期。非常感谢您的帮助。谢谢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
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');