0

我有一个具有以下结构的数据库表:

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) 的条目的情况。

4

1 回答 1

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, ActiveDateActiveQtr,外部查询进行求和。

Example SQLFiddle

于 2013-11-05T00:03:19.800 回答