จากประสบการณ์ของฉันวิธีที่เร็วที่สุดคือการใช้แต่ละแถวที่ไม่มีแถวที่ใหม่กว่าในตาราง
ข้อดีอีกอย่างคือไวยากรณ์ที่ใช้นั้นง่ายมากและความหมายของแบบสอบถามค่อนข้างง่ายต่อการเข้าใจ (รับทุกแถวโดยไม่มีแถวที่ใหม่กว่าสำหรับชื่อผู้ใช้ที่กำลังพิจารณา)
ไม่มีอยู่
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