带有重置的TRICKY滚动汇总查询

时间:2019-07-16 05:31:40

标签: mysql sql

假设有6个月的历史数据,每天有数百次游乐设施:

编写一个查询,该查询针对过去90天中的每一天返回该天前7天窗口中乘坐次数的计数

我想找到一种在 MySQL 中编写此代码的方法,但是在重新设置滚动总金额以及如何减少时间戳以反映一年中的某天/日期,然后按该日期分组。

我尝试编写子查询,将子查询的总和限制为一周前,然后在此之后再附加90天,但似乎无法获得返回任何输出的代码。

我曾尝试使用某种“窗口”功能将其编写为PostgreSQL,但在MySQL中工作要舒服得多,并且希望能够以这种方式解决它。我对如何编写限制,分组和顺序等很熟悉,但是我每周的总和重置有麻烦。

谢谢您的帮助!

2 个答案:

答案 0 :(得分:0)

首先,您需要一个数字表/查询。有一些棘手的CTE方法可以做到这一点,但现在仅在90行中添加数字1-90的表可能会更容易。

然后使用它为每一行生成一个日期范围。抱歉,如果语法不太正确,请按照以下内容编写查询: SELECT num, DATE_ADD(CURRENT_DATE(), INTERVAL -(num+7) DAY) startdate, DATE_ADD(CURRENT_DATE(), INTERVAL -num DAY) enddate FROM numbers

然后,您可以将其与通过nums分组的游乐设施表交叉连接并计算范围内的行:

SELECT num, startdate, enddate, SUM(CASE WHEN startdate <= ridedate AND ridedate <= enddate THEN 1 ELSE 0 END) ridecount FROM (date range query) dts, rides GROUP BY dts.num

希望有帮助。

答案 1 :(得分:0)

假设您每天都有数据,相关的子查询可能是最简单的方法:

select dt,
       (select count(*)
        from rides r
        where r.ridedate >= d.dte - interval 7 day and
              r.ridedate < d.date
       ) as rolling_7
from (select distinct ridedate as dt
      from rides
     ) dt