내 경험상 가장 빠른 방법은 테이블에 새로운 행이없는 각 행을 취하는 것입니다.
또 다른 장점은 사용 된 구문이 매우 단순하고 쿼리의 의미를 파악하기가 쉽다는 것입니다 (사용자 이름에 대해 새로운 행이 존재하지 않도록 모든 행을 취하십시오).
존재하지 않음
SELECT username, value
FROM t
WHERE NOT EXISTS (
SELECT *
FROM t AS witness
WHERE witness.username = t.username AND witness.date > t.date
);
ROW_NUMBER
SELECT username, value
FROM (
SELECT username, value, row_number() OVER (PARTITION BY username ORDER BY date DESC) AS rn
FROM t
) t2
WHERE rn = 1
내부 가입
SELECT t.username, t.value
FROM t
INNER JOIN (
SELECT username, MAX(date) AS date
FROM t
GROUP BY username
) tm ON t.username = tm.username AND t.date = tm.date;
왼쪽 외부 조인
SELECT username, value
FROM t
LEFT OUTER JOIN t AS w ON t.username = w.username AND t.date < w.date
WHERE w.username IS NULL