我有一个类似于以下的数据库模式:
| 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:另一个有前途的解决方案.也看起来很复杂,但我会再看看
再次感谢!
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)