Это вполне возможно.
Давайте предположим, что ваша структура таблицы выглядит следующим образом:
CREATE TABLE [dbo].[Ratings](
[Evaluator] varchar(10),
[Evaluatee] varchar(10),
[Rating] int,
[Date] datetime
);
и значения, как это:
INSERT INTO Ratings
SELECT 'Person 1', 'Person 2', 5, '2011-02-01' UNION
SELECT 'Person 1', 'Person 2', 2, '2011-03-01' UNION
SELECT 'Person 2', 'Person 1', 6, '2011-02-01' UNION
SELECT 'Person 2', 'Person 1', 3, '2011-03-01' UNION
SELECT 'Person 3', 'Person 1', 5, '2011-05-01'
Тогда средняя оценка для лица 1 является:
SELECT AVG(Rating) FROM Ratings r1
WHERE Evaluatee='Person 1' and not exists
(SELECT 1 FROM Ratings r2
WHERE r1.Evaluatee = r2.Evaluatee AND
r1.evaluator=r2.evaluator AND
r1.date < r2.date)
Результат :
4
Или для всех Evaluatee годов, сгруппированные по Evaluatee:
SELECT Evaluatee, AVG(Rating) FROM Ratings r1
WHERE not exists
(SELECT 1 FROM Ratings r2
WHERE r1.Evaluatee = r2.Evaluatee AND
r1.evaluator = r2.evaluator AND
r1.date < r2.date)
GROUP BY Evaluatee
Результат:
Person 1 4
Person 2 2
Это может выглядеть, как она есть неявное предположение, что никаких записей не существует с той же датой; , но это на самом деле не проблема: если такие записи могут существовать, то вы не можете решить, какие из них были сделаны позже; вы можете выбирать только случайно между ними. Как показано здесь, они оба включены и усреднены - это может быть лучшим решением, которое вы можете получить для этого пограничного случая (хотя это немного способствует этому человеку, давая ему два голоса).
Чтобы избежать этой проблемы в целом, вы можете просто сделать Date частью первичного ключа или уникальным индексом - очевидным выбором первичного ключа здесь являются столбцы (Evaluator, Evaluatee, Date).
ли ваша таблица также суррогатный синтетический первичный ключ? Может быть, автоинкрементное целое число? Это сделает запрос более простым и более эффективным, если это так. –
Какая версия SQL Server? – AakashM