具有复杂日期条件的SQL查询

时间:2013-11-04 22:38:36

标签: sql

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

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。

1 个答案:

答案 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