Сценарий: мне нужно отобразить среднее из последних 20 зарегистрированных значений. Мне нужно сделать это для всех пользователей. Использую Sql Server 2005 Express. Это самая низкая версия сервера БД, которую я должен поддерживать.
Способ, которым я делаю это сейчас: 1 запрос для выборки всех пользователей. 1 запрос на пользователя, чтобы получить последние 20 зарегистрированных значений. Хотя я не могу на самом деле сделать среднее значение в sql по деловым причинам, давайте пока предположим, что я могу.
Исходя из этого, в моей голове sql выполняет упорядочивание по дате, ограничение в 20 строк на пользователя и, наконец, группировка по идентификатору пользователя. К сожалению, кажется, нет никакого способа сделать это в SQL.
Есть ли способ избежать N + 1 запросов?
Edit1:
Ответ Эрика завершает работу. Однако я подожду некоторое время, прежде чем пометить его как ответ по двум причинам.
- Я хотел бы знать, есть ли какие-либо потери производительности для этого метода. Таблица отчетов будет содержать десятки тысяч строк на пользователя. Хотя мне нужно только усреднить последние 20.
- У меня возникает соблазн изменить вопрос (т.е. снять предположение) и отразить требования моего бизнеса. Я надеюсь, что, может быть, даже это можно решить только на SQL.
Тот же вопрос, но с удаленным предположением:
Среднее значение должно быть получено по 20 самым последним непрерывным отчетам. То есть, предположим, что последние 20 строк (в порядке убывания) содержат 15 строк (от 20 до 6) для времен с 14:25 до 14:40. И строки с 5 по 1 содержат время с 14:43 до 14:48 ... Самый последний непрерывный набор данных - это строки с 5 по 1. Таким образом, среднее значение должно быть сделано только для этих 5 строк . Не похоже, что данные будут поступать партиями, поэтому числа 15 и 5 с такой же легкостью могли бы быть 10 и 10 или 3, 5 и 12 или даже все 20 непрерывных (для простоты я предположил, что последние 20 все быть непрерывным).
Что вы, ребята, думаете? Это может быть сделано в SQL или это лучше всего обрабатывается в C #?
Редактировать 2:
Я думал об этом. В c # я бы начал с самой последней даты. Вычтите 1 минуту. И проверьте, соответствует ли следующая самая последняя дата этому значению. Если это так, добавьте его в список. Глядя на эти шаги, я не могу представить, как можно будет воспроизвести что-то подобное в SQL. На самом деле я до сих пор не уверен, каким будет ответ c # эквивалента ответа Эрика. Что заставляет меня задуматься, как можно думать в SQL?