Предполагая такую таблицу, как:
UID Name Datetime Users
4 Room 4 2012-08-03 14:00:00 3
2 Room 2 2012-08-03 14:00:00 3
3 Room 3 2012-08-03 14:00:00 1
1 Room 1 2012-08-03 14:00:00 2
3 Room 3 2012-08-03 14:15:00 1
2 Room 2 2012-08-03 14:15:00 4
1 Room 1 2012-08-03 14:15:00 3
1 Room 1 2012-08-03 14:30:00 6
1 Room 1 2012-08-03 14:45:00 3
2 Room 2 2012-08-03 14:45:00 7
3 Room 3 2012-08-03 14:45:00 8
4 Room 4 2012-08-03 14:45:00 4
Я хотел получить среднее количество пользователей в каждой комнате (1,2,3,4 )с 14:00 до 15:00. Проблема заключается в том, что иногда комната может не «отмечаться» в течение 15-минутного интервала, поэтому необходимо сделать предположение, что предыдущее последнее известное количество пользователей остается действительным.
Например, регистрация -для 2012-08-03 14:15:00
комнаты 4 никогда не регистрировалась, поэтому следует предположить, что в комнате 4 было 3 пользователя в 2012-08-03 14:15:00
, потому что это то, что было в2012-08-03 14:00:00
Это следует до конца, так что среднее количество пользователей, которое я ищу, выглядит следующим образом:
Комната 1:(2 + 3 + 6 + 3 )/ 4 = 3,5
Комната 2:(3 + 4 + 4
+ 7 )/ 4 = 4,5
Комната 3:(1 + 1 + 1
+ 8 )/ 4 = 2,75
Комната 4:(3 + 3
+ 3
+ 4 )/ 4 = 3,25
где #
— предполагаемое число, основанное на предыдущей известной проверке -в.
Мне интересно, возможно ли это сделать только с помощью SQL? если нет, то мне любопытно гениальное PHP-решение, которое не является просто математическим перебором, например, мой быстрый неточный псевдокод:
foreach ($rooms_id_array as $room_id) {
$SQL = "SELECT * FROM `table` WHERE (`UID` == $room_id && `Datetime` >= 2012-08-03 14:00:00 && `Datetime` <= 2012-08-03 15:00:00)";
$result = query($SQL);
if ( count($result) < 4 ) {
// go through each date and find what is missing, and then go to previous date and use that instead
} else {
foreach ($result)
$sum += $result;
$avg = $sum / 4;
}
}