从多列开始按日期分组?

时间:2013-01-12 00:20:56

标签: mysql sql

首先抱歉该标题,但我不知道如何描述它:

我正在我的桌子中保存会话,我希望得到每小时的会话数,以了解当天有多少会话活动。会话由两个时间戳指定:开始和结束。

希望你能帮助我。

我们走了: http://sqlfiddle.com/#!2/bfb62/2/0

3 个答案:

答案 0 :(得分:1)

虽然我仍然不确定您希望如何比较开始日期和结束日期,但看起来像使用COUNTYEARMONTHDAY,和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

答案 1 :(得分: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

注意:这些都是未经测试的,因此可能存在语法错误。

答案 2 :(得分:0)

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

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

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

以下是解决方案的SQL fiddle

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