2016-09-23 84 views
1

我想对我的数据库中的记录进行统计,我想计算用户从某个日期时间和/或某个日期时间以及每个4每天小时数获取日期时间从/到特定小时之间的平均数

简单示例:我想从'2016-09-20 00:00:00'到'2016-09-23 23:59:59'的成功登录平均值,结果应该是('00:00:00' - '11:59:59')和''12:00:00' - '23:59:59'示例数据(其中状态1表示成功,0表示不成功):

| id | | driver_id | login_timedate  | status | 
| 1 | | 1 | '2016-09-20 00:00:11' | 1 | 
| 2 | | 2 | '2016-09-20 01:16:09' | 1 | 
| 3 | | 2 | '2016-09-20 23:01:16' | 1 | 
| 4 | | 3 | '2016-09-21 04:04:59' | 1 | 
| 5 | | 3 | '2016-09-21 05:06:59' | 0 | 
| 6 | | 2 | '2016-09-21 16:06:59' | 1 | 
| 7 | | 1 | '2016-09-22 00:16:59' | 1 | 
| 8 | | 2 | '2016-09-23 04:09:22' | 0 | 
| 9 | | 1 | '2016-09-23 06:22:59' | 1 | 
| 10 | | 3 | '2016-09-23 22:09:22' | 1 | 
| 11 | | 1 | '2016-09-24 00:00:22' | 1 | 
  • 因此,在这种情况下,我会得到成功登录的总数从(20-23/09/2016)是:8(DAY1 = 3,DAY2 = 2,第3天 = 1,第四天 = 2)

  • 总数的范围内的每一天从('00成功的:00:00' - '11:59:59')是(DAY1 = 2,DAY2 = 1,第三天 = 1,第四天 = 1)

  • 平均: 5/4 = 1.25

  • 总数成功的的范围内的每一天从('00:00:00' - '11:59:59')是(DAY1 = 1,DAY2 = 0,第3天= 1,第四天= 1)

  • 平均: 3/4 = 0 。75

我已经做了第一部分获得的日期时间范围内成功登录的总数,这是我的代码(这将返回8)

SET @start_date = '2016-09-20'; 
SET @start_taime = '00:00:00'; 

SET @end_date = '2016-09-23'; 
SET @end_time = '23:59:59'; 

SELECT SUM(`total_logins`.`number_of_success`) FROM (
    SELECT COUNT(`login_logs`.`driver_id`) AS `number_of_success` 
    FROM `login_logs` 
    WHERE `login_logs`.`status` = 1 
    AND 
    `login_logs`.`login_timedate` >= CONCAT(@start_date, ' ', @start_time) 
    AND 
    `login_logs`.`login_timedate` <= CONCAT(@end_date, ' ', @end_time) 
    GROUP BY `login_logs`.`user_id` 
) AS `total_logins` 

#更新: 此代码的预期输出:

| total_logins | 
|  8  | 

我想这样做,其计算相同的日期时间范围内的平均登录从XX的下一部分:XX:XX时间YY:YY:YY时间如此:

  • 总数成功的的范围内的每一天从('00:00:00' - '11:59:59')是(DAY1 = 2,DAY2 = 1 ,第三天 = 1,第四天 = 1)
    • 平均: 5/4 = 1.25

#UPDATE: 预期输出修改我的代码来获得avrage后(00:00:00' - '11:59:59' ):

| Avrage_00_12 | 
|  1.25  | 

应该如何我修改代码来实现这部分?

我希望你明白我的问题

感谢您的帮助先进

+0

我不完全听从你的问题。请向我们展示您的预期产出。 –

+0

@TimBiegeleisen已更新它的问题与预期的产出 –

回答

2

您可以使用下面的查询:

SELECT SUM(`number_of_success`) AS `total_success`, 
     SUM(`success_range1`)/COUNT(*) AS `average1`, 
     SUM(`success_range2`)/COUNT(*) AS `average2` 
FROM (
    SELECT DATE(`login_logs`.`login_timedate`), 
      COUNT(`login_logs`.`driver_id`) AS `number_of_success`, 
      COUNT(CASE 
        WHEN TIME(`login_logs`.`login_timedate`) 
         BETWEEN '00:00:00' AND '11:59:59' 
        THEN 1 
       END) AS `success_range1`, 
      COUNT(CASE WHEN TIME(`login_logs`.`login_timedate`) 
          BETWEEN '12:00:00' AND '23:59:59' 
        THEN 1 
       END) AS `success_range2` 
    FROM `login_logs` 
    WHERE `login_logs`.`status` = 1 
      AND 
      `login_logs`.`login_timedate` >= '2016-09-20 00:00:00' 
      AND 
      `login_logs`.`login_timedate` <= '2016-09-23 23:59:59' 
    GROUP BY DATE(`login_logs`.`login_timedate`)) AS t 

输出:

total_success, average1, average2 
---------------------------------- 
8,    1.2500, 0.7500 
+0

谢谢我认为它的工作。如果我想在'00:00:00'和'11:59:59'' –

+0

之间的范围内有最大和最小的登录次数,那么不用担心我会发现 –