完全有可能。
假设您的表结构如下所示:
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
或者对于所有被评估者,按被评估者分组:
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)。