2013-01-12 106 views
1

首先对于那个标题感到抱歉,但我不知道如何描述它:从多个列按日期分组?

我正在将会话保存在我的表格中,我想知道每小时的会话数以了解有多少会话积极的一天。会话由两个时间戳指定:开始和结束。

希望你能帮助我。

这里,我们去: http://sqlfiddle.com/#!2/bfb62/2/0

+0

您可以使用您的模式和数据集创建www.sqlfiddle.com示例吗? – Martin

+0

当天活跃,你的意思是开始和结束日期都在同一天?或者开始或结束日期? COUNT操作员应该很容易做到。 – sgeddes

+0

对于每个小时,开始时间必须在该小时之前和结束时间之后。我如何在我的where子句中使用它? –

回答

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 

注:这些都是未经测试的那么可能有语法错误。

+0

哇谢谢你!但是如果我看一下,我应该也许只是运行24个查询,而不是构建一个我无法工作的大问题,因为我不明白:p只是希望有一个小小的技巧来做到这一点。但谢谢你的努力 –

1

虽然我还是不知道你想如何比较的开始和结束日期,看起来像使用COUNTYEARMONTHDAYHOUR,你可以拿出你想要的结果。

东西可能与此类似:

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

+0

你好,谢谢你,但我不认为这是解决方案。问题是,我也必须检查结束时间,以确定会话是否在特定时间处于活动状态。 看到这个例子:http://sqlfiddle.com/#!2/e343d/1/0 这是错误的,因为应该有3,而不是2. –

+0

你想要的结果是什么?我还没有完全理解。 – sgeddes

+0

好的,对不起。让我们拿最后一个sqlfiddle。有3个会话在17:00处于活动状态,因此XXXX 17:00我希望看到值3.如果您考虑用户会话,那么我只想知道有多少用户只在01:00,02 :00等。 –

0

好的,这是索引表来拯救的另一个问题。

索引表是每个人都应该在其工具包中使用的东西,最好是在主数据库中。它是一个带有一个id int primary key索引列的表格,其中包含从0到n的连续数字,其中n是一个足以满足需要的数字,100,000是好的,1,000,000是更好的。你只需要创建一次这个表,但一旦你做了,你会发现它有各种应用程序。

对于您的问题,您需要考虑每个小时,如果我了解您的问题,则需要计算在小时结束前开始的每个会话,并且在小时开始之前尚未结束。

这是解决方案的SQL fiddle

它的作用是使用索引表中已知的序列号(对于这个小提琴只有0到100个 - 仅仅4天以上 - 你可以看到为什么你需要一个大n)来链接你的数据在顶部和底部的时间。