【问题标题】:Totals over rolling timeframe滚动时间范围内的总计
【发布时间】:2015-03-13 17:32:00
【问题描述】:

我的数据是这样排列的:

obj_id 数量日期 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 ...

我需要的是在 RANGE 天内找到 SUM(quantity) > MAX 的 OBJ_ID。 在我的例子中,MAX 是 18,RANGE 是 31 天。

换句话说,每个给定的 OBJ_ID 都会不时收到 QUANTITY(无论如何)。我需要找到总共收到超过 18 个的 OBJ_ID 以及该 OBJ_ID 收到 Qs 的日期跨度小于 31 天。哦。)

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

提前致谢。

【问题讨论】:

  • 您想要过去 31 天内的日期吗?
  • @tbone 不,任何 31 天 - 这就是它“滚动”的原因。不知道我的措辞是否正确。

标签: sql oracle time-series


【解决方案1】:

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

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

【讨论】:

  • 谢谢,但我感兴趣的记录可能属于任何机密。 31 天。对不起,如果我不够清楚
【解决方案2】:

我目前正在测试我的一位同事快速整合的解决方案:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 2020-12-23
    • 2011-01-02
    • 2018-03-05
    • 2021-05-27
    • 2023-03-03
    • 2018-12-28
    相关资源
    最近更新 更多