2015-10-13 2 views
0

Мне сложно найти правильный запрос, пожалуйста, помогите. Пояснения: У меня есть таблица, в которой строки вставляются на основе состояния входа. таблица выглядит следующим образом (его часть):Значения SQL TIMESTAMPDIFF, упорядоченные по дневным записям

+----------+------------+-----------+---------+---------------------+ 
| username | view_start | view_stop | action |  action_time  | 
+----------+------------+-----------+---------+---------------------+ 
| adrian | 10:00:00 |   | log-in | 2015-09-01/10:00:00 | 
| adrian | 10:00:00 | 10:35:00 | log-off | 2015-09-01/10:35:00 | 
| john  | 12:00:00 |   | log-in | 2015-09-01/12:00:00 | 
| john  | 12:00:00 | 12:45:00 | log-off | 2015-09-01/12:45:00 | 
+----------+------------+-----------+---------+---------------------+ 

Я хочу получить следующие вещи:

  • сосчитать различия между view_start и view_stop для строк, которые имеют действие log-off (последнее действие, которое они совершили)

  • заказать этот список на основе детского времени (общее время, когда пользователи были зарегистрированы в этот день)

То, что я достиг до сих пор:

я насчитал и заказал всего пользователей на основе днем ​​

SELECT DATE(action_time) Date, COUNT(DISTINCT username) totalCOunt 
FROM audit_data 
GROUP BY DATE(action_time) 

Выход:

+------------+------------+ 
| date | totalCOunt | 
+------------+------------+ 
| 2015-09-01 |   5 | 
| 2015-09-02 |   3 | 
| 2015-09-03 |   1 | 
| 2015-09-04 |   7 | 
+------------+------------+ 

Я подсчитал разницу между двумя датами

SELECT view_start, view_stop,username, TIMESTAMPDIFF(MINUTE, view_start, view_stop) AS MinuteDiff 
FROM audit_data 
WHERE action = "off-line" 
ORDER BY username 

+------------+-----------+----------+------------+ 
| view_start | view_stop | username | MinuteDiff | 
+------------+-----------+----------+------------+ 
| 10:00:00 | 11:00:00 | adrian |   60 | 
| 11:00:00 | 12:00:00 | adrian |   60 | 
| 12:00:00 | 13:00:00 | john  |   60 | 
| 13:00:00 | 14:00:00 | george |   60 | 
+------------+-----------+----------+------------+ 

Я хочу «объединить» эти запросы, чтобы вычислить общее время, чтобы пользователи были зарегистрированы в, в дни:

+-------------+---------------------+ 
|  day  | totalDiff (minutes) | 
+-------------+---------------------+ 
| 2015-09-01 |     120 | 
| 2015-09-02 |     38 | 
| 2015-09-03 |     76 | 
| 2015-09-04 |     156 | 
+-------------+---------------------+ 

Важная деталь: Пользователь может войти, несколько раз в день

Запрос, что я пробовал: SELECT DATE(action_time) Date, COUNT(SELECT SUM(SELECT TIMESTAMPDIFF(MINUTE, view_start, view_stop))) totalCOunt FROM audit_data GROUP BY DATE(action_time)

+0

Что делать, если пользователь зарегистрирован более чем в полночь? – dnoeth

+0

Умный вопрос ... Думаю, это будет засчитано на следующий день. Данные не обязательно должны быть предельно точными – Adrian

+0

Какая СУБД вы используете? 'action =" off-line "' является нестандартным SQL –

ответ

0

на основании вашего описания вам нужно просто просуммировать минут:

SELECT DATE(action_time) Date 
    ,COUNT(DISTINCT username) totalCOunt 
    ,SUM(TIMESTAMPDIFF(MINUTE, view_start, view_stop)) AS totalDiff 
FROM audit_data 
GROUP BY DATE(action_time) 
ORDER BY 1 

См. Fiddle

+0

Я уже пробовал это, и он дает мне ошибку (возможно, запрос не хорошо написан) 'У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с именем COUNT (DISTINCT username) totalCOunt , SUM (TIMESTAMPDIFF (MINUTE, view_start, v 'в строке 2 ' – Adrian

+0

Запрос, который я пробовал:' SELECT DATE (action_time) Дата, COUNT (SELECT SUM (SELECT TIMESTAMPDIFF (MINUTE, view_start, view_stop))) totalCOunt FROM audit_data GROUP BY DATE (action_time) '. Это дает мне ту же ошибку – Adrian

+0

@Adrian: Я только что проверил его, и он отлично работает на Fiddle (см. править), должно быть что-то еще. – dnoeth

Смежные вопросы