用于在一段时间内找到最大项目的算法建议

D.C*_*.C. 5 mysql sql

我有一个类似于以下的数据库模式:

| User   | Event         | Date
|--------|---------------|------
| 111    | Walked dog    | 2009-10-1
| 222    | Walked dog    | 2009-10-2
| 333    | Fed Fish      | 2009-10-5
| 222    | Did Laundry   | 2009-10-6
| 111    | Fed Fish      | 2009-10-7
| 111    | Walked dog    | 2009-10-18
| 222    | Walked dog    | 2009-10-19
| 111    | Fed Fish      | 2009-10-21
Run Code Online (Sandbox Code Playgroud)

我想生成一个查询,返回用户在一段时间内执行某些操作的最大次数.例如,给定5天的时间段,用户111遛狗的最大次数是多少?

最明显的解决方案是从某个零点开始并每天前进,总计5天的时间段,然后从所有5天的窗口中取出最大总数.然而,这种方法似乎非常昂贵.

我很感激您的任何建议.

编辑1:

感谢您的评论/答案.回应: - 我正在使用mySQL v5.0 - 每天可能有任意数量的事件(真的是每个时间段) - @Paulo Santos:谢谢,但是就像评论指出的那样,我需要找到一个窗口产生最多的结果,窗口本身可以滑动. - @Mark:这看起来像一个有趣的解决方案,虽然我记得读到mySQL不支持备份或跳过游标.
- @orbMan:这看起来很有希望.我还没有完全理解它,但今晚我会试一试. - @mjv:另一个有前途的解决方案.也看起来很复杂,但我会再看看

再次感谢!

Red*_*ter 2

select top 1 x.Date as StartDate, DATEADD(day, 5, x.Date) as EndDate, COUNT(*) as Count
from Event e
inner join Event x on 1=1
where e.Date between x.Date and DATEADD(day, 5, x.Date)
    and e.Event = 'Walked dog'
group by x.Date, DATEADD(day, 5, x.Date)
order by Count desc
Run Code Online (Sandbox Code Playgroud)

输出:

StartDate  EndDate    Count
---------- ---------- -----------
2009-10-01 2009-10-06 2
Run Code Online (Sandbox Code Playgroud)