СУММА данных из последнего обновления от группы - PullRequest
4 голосов
/ 13 июня 2019

Итак, у нас есть таблица, в которой мы храним прогнозируемый уровень шума для нескольких комнат на почасовой основе наряду со временем, когда был сделан прогноз.

Но этот прогноз может меняться несколько раз в день, икогда это происходит, мы добавляем новую строку в таблицу, чтобы сохранить историю, поэтому у нас есть что-то вроде этого:

+----+----+-------+--------+------+-------+---------------------+
| room_id | reference_date | hour | noise |     update_time     |
+----+----+-------+--------+------+-------+---------------------+
|    1    |   2019-06-13   |   8  |    0  | 2019-06-13 07:15:23 |
|    1    |   2019-06-13   |   9  |    5  | 2019-06-13 07:15:23 |
|    2    |   2019-06-13   |   8  |    2  | 2019-06-13 07:15:23 |
|    1    |   2019-06-13   |   8  |    5  | 2019-06-13 08:15:23 |
|    1    |   2019-06-13   |   9  |    5  | 2019-06-13 08:15:23 |
+---------+--------+--------+-----+-------+---------------------+

Теперь мы хотим суммировать прогнозируемый уровень шума на весь день, но используя толькоlast update_time, else будет иметь несколько записей для одного и того же часа дня вместо одного.

Я пробовал несколько только примеров, но не смог заставить его работать с одним запросом, мы используемSQL Server 14.0.3030.27.Я мог бы сделать это в коде, но я считаю, что есть лучшее решение для этого.

Результат запроса должен быть примерно таким:

+----+----+-------+--------+------+-------+----+
| room_id | reference_date | total_daily_noise |
+----+----+-------+--------+-------------------+
|    1    |   2019-06-13   |        10         |
+---------+--------+-------+-------------------+

Можно ли сделать это с помощью одного запроса?

Заранее спасибо за помощь!

1 Ответ

4 голосов
/ 13 июня 2019

row_number() - это один метод получения самого последнего прогноза для каждого часа:

select room_id, reference_date, sum(noise) as noise
from (select t.*,
             row_number() over (partition by room_id, reference_date, hour order by update_time desc) as seqnum
      from t
     ) t
where seqnum = 1
group by room_id;

Другой метод использует коррелированный подзапрос:

select room_id, reference_date, sum(noise) as noise
from t
where t.update_time = (select max(t2.update_time)
                       from t t2
                       where t2.room_id = t.room_id and
                             t2.reference_date = t.reference_date and
                             t2.hour = t.hour
                      )
group by room_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...