Среднее значение за период времени с отсутствующими данными

Предполагая такую ​​таблицу, как:

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;
    }

}
16
задан Zane Bien 26 August 2012 в 05:41
поделиться