WITH RANKED AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY date) AS rn FROM questions_pass_record ), NEXT AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY date) AS rn FROM questions_pass_record ) SELECT RANKED.user_id, RANKED.date, NEXT.date as nextdate FROM RANKED LEFT JOIN NEXT ON RANKED.user_id = NEXT.user_id AND RANKED.rn + 1 = NEXT.rn ORDER BY RANKED.user_id, RANKED.date