我有一个具有以下结构的数据库表:
ID ActiveDate ActiveQtr InactiveQtr Value
------------------------------------------------------------------
1 2004-06-30 2004-06-30 2004-12-31 10
1 2004-08-10 2004-09-30 2004-12-31 200
2 2004-12-31 2004-12-31 2005-03-31 150
2 2005-01-20 2005-03-31 2005-12-31 60
2 2005-03-31 2005-03-31 2005-12-31 75
3 2005-04-15 2005-06-30 2007-06-30 100
2 2005-06-30 2005-06-30 2006-06-30 80
ActiveDate可以是任何日期。 ActiveQtr是ActiveDate推进到下一个季度结束日期。 InactiveQtr是大于或等于ActiveQtr的季度结束日期。 InactiveQtr不一定对应于ID的最新条目的日期,并且ActiveQtr和InactiveQtr之间的差异在条目之间不一致。
我想要的是为每个ActiveQtr找到与该季度仍处于活动状态的每个ID的最新条目对应的所有值的总和。
对于此示例,结果应如下所示
ActiveQtr SUM(Value)
-------------------------
2004-06-30 10
2004-09-30 200 // use more recent entry for ID=1
2004-12-31 350 // entry from ID=1 on 2004-08-10 is still valid
2005-03-31 75 // entry from ID=1 not valid anymore; also only use more recent entry from ID=2
2005-06-30 180
我已尝试通过ActiveQtr进行分组,但这不起作用,因为我丢失了在该季度仍处于活动状态的条目。我也不知道如何处理对于特定季度有效的ID有多个条目的情况,我需要选择具有MAX(ActiveDate)的ID。
答案 0 :(得分:3)
如果您有CTE和窗口函数,可能有更简单的方法可以做到这一点。这种数据表示特别粗糙,但这适用于提供的数据:
Select
x.activeqtr,
sum(y.value)
From (
select
t1.activeqtr,
t2.id,
max(t2.activedate) activedate
from
test6 t1,
test6 t2
Where
t1.activedate <= t2.inactiveqtr and
t1.activedate >= t2.activedate
group by
t1.activeqtr,
t2.id
) x
inner join
test6 y
on x.activedate = y.activedate and
x.id = y.id
group by
x.activeqtr
内部查询确定每个id, ActiveDate
使用哪个ActiveQtr
对,外部查询进行求和。
<强> Example SQLFiddle 强>