완벽하게 가능합니다.
의 당신의 테이블 구조는 다음과 같습니다 가정 해 봅시다 :
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'
가 그런 사람 일에 대한 평균 평가는 다음과 같습니다 :
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)
결과
CREATE TABLE [dbo].[Ratings](
[Evaluator] varchar(10),
[Evaluatee] varchar(10),
[Rating] int,
[Date] datetime
);
와 같은 값 :
Evaluatee별로 그룹화
또는 모든 Evaluatee의에 대한 7,573,213,210 :
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
이 더 항목이 동일한 날짜에 존재하지 않는 것을 암시 가정을 가지고 같은이 보일 수 있습니다; 하지만 실제로는 문제가되지 않습니다. 이러한 항목이있을 수 있다면 나중에 만들어 졌는지 결정할 수 없습니다. 당신은 그들 사이에서 무작위로 선택할 수 있습니다. 여기에 나와 있듯이, 둘 다 포함되고 평균화됩니다. 국경을 넘을 수있는 최선의 해결책이 될 수 있습니다 (비록 그 사람을 약간 찬성하되 두 표를 얻음).
이 문제를 완전히 피하려면 단순히 기본 키 또는 고유 인덱스의 날짜 부분을 만드십시오. 여기에서 명백한 기본 키는 열 (Evaluator, Evaluatee, Date)입니다.
은 또한 당신의 테이블이 대리 합성 기본 키를 가지고 있습니까? 아마도 자동 증가하는 ID 정수일까요? 그렇다면 쿼리가 더 쉽고 성능이 향상 될 것입니다. –
어떤 버전의 SQL Server입니까? – AakashM