SQL Server; Oracle; PostgreSQL:
SELECT user_id, pay_dt, order_id FROM( SELECT ROW_NUMBER()OVER(PARTITION BY user_id ORDER BY pay_dt, order_id)N, P.* FROM payments P )T WHERE N=3
UPD: deleted erroneous responses. did not consider what is needed for each user ...
UPD2: without samojoynov for MySQL only such solution comes to mind:
SELECT user_id, pay_dt, order_id FROM( SELECT payments.*, @I := IF(user_id = @UserId, @I:=@I+1, @I:=1) N, @UserId := user_id user_id FROM payments, (SELECT @I := 0, @UserId := null)I ORDER BY user_id, pay_dt, order_id )T WHERE N=3
How it works: we sort in the order of user_id , pay_dt , see if the current user_id is equal to the previous one, then add one to @I , otherwise assign it 1 (start over numbering for the new user). Analogue of PARTITION BY in ROW_NUMBER other DBMS with numbering.
According to mike's advice:
SELECT user_id, SUBSTR(GROUP_CONCAT(pay_dt ORDER BY pay_dt), 41, 19)pay_dt_3rd FROM payments GROUP BY user_id HAVING COUNT(*)>=3