滚动时间表总计

时间:2015-01-15 10:34:17

标签: sql oracle time-series

我的数据安排如下:

obj_id    quantity date
1         3        2014-05-06
2         2        2014-03-12
3         5        2014-10-07
4         7        2014-05-09
2         8        2014-12-31
1         5        2014-01-16
4         1        2014-07-26
3         2        2014-09-15
...

我需要找到具有SUM(数量)>的OBJ_ID。 MAX超过RANGE天数。 在我的情况下,MAX为18,RANGE为31天。

换句话说,每个给定的OBJ_ID会不时收到QUANTITY(无论什么)。我需要找到总共超过18个的OBJ_ID以及这个OBJ_ID收到Qs的日期超过31天。 DOH。)

我想我需要在这里使用LAG,但不确定整个事情应该如何。

提前致谢。

2 个答案:

答案 0 :(得分:1)

这可能需要一些调整,因为我没有时间对它进行适当的测试,但也许它会让你走上正确的轨道: (我以为你想要的是日期在过去31天内的记录)

SELECT SUM(quantity)
FROM tblTable
WHERE date between DATEADD(day, -RANGE, GETDATE()) and GETDATE()
HAVING SUM(quantity) > MAX
GROUP BY obj_id

答案 1 :(得分:1)

我目前正在测试我的同事迅速整理的解决方案:

SELECT A.*
FROM (
            SELECT A.obj_id
            , A.date
            , A.in_month_date
            , A.date - A.in_month_date AS in_month
            , A.quantity
            , A.in_month_quantity

            FROM (
                            SELECT A.obj_id
                            , A.date

                            , FIRST_VALUE(A.date)
                            OVER (
                                            PARTITION BY A.obj_id
                                            ORDER BY A.date
                                            RANGE BETWEEN 31 PRECEDING
                                            AND CURRENT ROW
                            ) AS in_month_date

                            , A.quantity

                            , SUM(A.quantity)
                            OVER (
                                            PARTITION BY A.obj_id
                                            ORDER BY A.date
                                            RANGE BETWEEN 31 PRECEDING
                                            AND CURRENT ROW
                            ) AS in_month_quantity

                            FROM mytable A
            ) A
) A
WHERE A.in_month <=  31
AND A.in_month_quantity >  18