我希望在一个表格中获得前五项,但在一段时间内,比如7天。
这是表结构和一些随机示例数据
user_id | entry_id | sig | timestamp 1 1 8846 2015-03-27 20:49:56 1 2 8846 2015-03-27 20:49:56 1 3 8846 2015-03-27 20:49:56 1 4 4544 2015-03-27 20:49:56 1 5 4544 2015-03-27 20:49:56 1 6 65445 2015-03-27 20:49:56
User_id是唯一的,entry_id是主键。
例如,我想查询 sig 列,计算7天内每个数字的出现次数,比如8846出现20次。
这是我到目前为止的SQL查询,它计算出现次数但不在一段时间内。它的基本目前只需要一个有效的例子。
SELECT sig, count(sig), sig_count FROM event
GROUP BY sig
ORDER BY sig_count
DESC LIMIT 5;
(编辑)其他细节
我以前错误地说过了这个问题。我真正要说的是我需要根据过去7天内的事件获得前5个 sigs 并返回这些记录。数据将用于填充各种图表。
因此,例如,如果我可以获得结果然后使用PHP,我可以使用entry_id并循环遍历它以获取时间戳和出现次数(频率' x'时间' y& #39;)并将其弹出到图表中。
我猜第一个查询得到计数结果。然后可以运行第二个查询来获取特定的sig id以及过去7天内与之关联的所有记录。
任何贡献都将不胜感激。
答案 0 :(得分:1)
由于每个组没有相同的时间范围(每行7天内不同),您必须使用子查询在每行7天内获得计数,这将是缓慢但我不是确定还有另一种方法可以做到。
select sig, max(sig_count)
from (
select sig,
(select count(*) from event e2
where e2.sig = e1.sig
and e2.timestamp between date_sub(e1.timestamp,interval 7 day)
and date_add(e1.timestamp,interval 7 day)) as sig_count
from event e1
) t1 group by sig
order by max(sig_count) desc
limit 5
答案 1 :(得分:1)
据我了解你的问题,这是一个带有where
子句的聚合:
select sig, count(*) as sig_count
from table t
where timestamp >= date_sub(now(), interval 7 day)
group by sig
order by sig_count desc
limit 5;