首先对于那个标题感到抱歉,但我不知道如何描述它:从多个列按日期分组?
我正在将会话保存在我的表格中,我想知道每小时的会话数以了解有多少会话积极的一天。会话由两个时间戳指定:开始和结束。
希望你能帮助我。
这里,我们去: http://sqlfiddle.com/#!2/bfb62/2/0
首先对于那个标题感到抱歉,但我不知道如何描述它:从多个列按日期分组?
我正在将会话保存在我的表格中,我想知道每小时的会话数以了解有多少会话积极的一天。会话由两个时间戳指定:开始和结束。
希望你能帮助我。
这里,我们去: http://sqlfiddle.com/#!2/bfb62/2/0
你想要做的事情在MySQL中相当困难。但是,您可以在没有太多困难的情况下获得近似值。以下计算在一天内启动和停止的用户:
select date(start), hour,
sum(case when hours.hour between hour(start) and hours.hour then 1 else 0
end) as GoodEstimate
from sessions s cross join
(select 0 as hour union all
select 1 union all
. . .
select 23
) hours
group by date(start), hour
当用户跨度多个天时,查询会更加困难。这里有一个方法,即假设存在谁启动用户每隔一小时期间:
select thehour, count(*)
from (select distinct date(start), hour(start),
(cast(date(start) as datetime) + interval hour(start) hour as thehour
from sessions
) dh left outer join
sessions s
on s.start <= thehour + interval 1 hour and
s.end >= thehour
group by thehour
注:这些都是未经测试的那么可能有语法错误。
哇谢谢你!但是如果我看一下,我应该也许只是运行24个查询,而不是构建一个我无法工作的大问题,因为我不明白:p只是希望有一个小小的技巧来做到这一点。但谢谢你的努力 –
虽然我还是不知道你想如何比较的开始和结束日期,看起来像使用COUNT
,YEAR
,MONTH
,DAY
和HOUR
,你可以拿出你想要的结果。
东西可能与此类似:
SELECT COUNT(ID), YEAR(Start), HOUR(Start), DAY(Start), MONTH(Start)
FROM Sessions
GROUP BY YEAR(Start), HOUR(Start), DAY(Start), MONTH(Start)
而且SQL Fiddle。
你好,谢谢你,但我不认为这是解决方案。问题是,我也必须检查结束时间,以确定会话是否在特定时间处于活动状态。 看到这个例子:http://sqlfiddle.com/#!2/e343d/1/0 这是错误的,因为应该有3,而不是2. –
你想要的结果是什么?我还没有完全理解。 – sgeddes
好的,对不起。让我们拿最后一个sqlfiddle。有3个会话在17:00处于活动状态,因此XXXX 17:00我希望看到值3.如果您考虑用户会话,那么我只想知道有多少用户只在01:00,02 :00等。 –
好的,这是索引表来拯救的另一个问题。
索引表是每个人都应该在其工具包中使用的东西,最好是在主数据库中。它是一个带有一个id int primary key
索引列的表格,其中包含从0到n的连续数字,其中n是一个足以满足需要的数字,100,000是好的,1,000,000是更好的。你只需要创建一次这个表,但一旦你做了,你会发现它有各种应用程序。
对于您的问题,您需要考虑每个小时,如果我了解您的问题,则需要计算在小时结束前开始的每个会话,并且在小时开始之前尚未结束。
这是解决方案的SQL fiddle。
它的作用是使用索引表中已知的序列号(对于这个小提琴只有0到100个 - 仅仅4天以上 - 你可以看到为什么你需要一个大n)来链接你的数据在顶部和底部的时间。
您可以使用您的模式和数据集创建www.sqlfiddle.com示例吗? – Martin
当天活跃,你的意思是开始和结束日期都在同一天?或者开始或结束日期? COUNT操作员应该很容易做到。 – sgeddes
对于每个小时,开始时间必须在该小时之前和结束时间之后。我如何在我的where子句中使用它? –