2016-09-23 82 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

之間的範圍內有最大和最小的登錄次數,那麼不用擔心我會發現 –