You might have duplicate rows too. You could use Analytic ranking function to fetch the required rows.
Set up:
SQL> CREATE TABLE Table1
2 (PERSON_ID int, EFFECTIVE_END_DATE varchar2(21), ASSIGNMENT_ID int, FULL_NAME varchar2(7));
Table created.
SQL>
SQL> INSERT ALL
2 INTO Table1 (PERSON_ID, EFFECTIVE_END_DATE, ASSIGNMENT_ID, FULL_NAME)
3 VALUES (33151, to_date('2013-08-04','YYYY-MM-DD'), 33885, 'Test, C')
4 INTO Table1 (PERSON_ID, EFFECTIVE_END_DATE, ASSIGNMENT_ID, FULL_NAME)
5 VALUES (33151, to_date('2013-10-04','YYYY-MM-DD'), 33885, 'Test, C')
6 INTO Table1 (PERSON_ID, EFFECTIVE_END_DATE, ASSIGNMENT_ID, FULL_NAME)
7 VALUES (33151, to_date('2015-02-19','YYYY-MM-DD'), 33885, 'Test, C')
8 INTO Table1 (PERSON_ID, EFFECTIVE_END_DATE, ASSIGNMENT_ID, FULL_NAME)
9 VALUES (33151, to_date('2013-08-04','YYYY-MM-DD'), 33885, 'Test, C')
10 INTO Table1 (PERSON_ID, EFFECTIVE_END_DATE, ASSIGNMENT_ID, FULL_NAME)
11 VALUES (33151, to_date('2013-10-04','YYYY-MM-DD'), 33885, 'Test, C')
12 INTO Table1 (PERSON_ID, EFFECTIVE_END_DATE, ASSIGNMENT_ID, FULL_NAME)
13 VALUES (33151, to_date('2015-02-19','YYYY-MM-DD'), 33885, 'Test, C')
14 SELECT * FROM dual;
6 rows created.
SQL>
SQL> COMMIT;
Commit complete.
SQL>
SQL> SELECT * FROM table1;
PERSON_ID EFFECTIVE_END_DATE ASSIGNMENT_ID FULL_NA
---------- --------------------- ------------- -------
33151 04-AUG-13 33885 Test, C
33151 04-OCT-13 33885 Test, C
33151 19-FEB-15 33885 Test, C
33151 04-AUG-13 33885 Test, C
33151 04-OCT-13 33885 Test, C
33151 19-FEB-15 33885 Test, C
6 rows selected.
SQL>
Test case:
SQL> WITH data AS
2 (SELECT t.*,
3 rank() over(partition BY person_id order by person_id, EFFECTIVE_END_DATE DESC) rn
4 FROM table1 t
5 )
6 SELECT PERSON_ID,
7 EFFECTIVE_END_DATE,
8 ASSIGNMENT_ID,
9 FULL_NAME
10 FROM data
11 WHERE rn = 1;
PERSON_ID EFFECTIVE_END_DATE ASSIGNMENT_ID FULL_NA
---------- --------------------- ------------- -------
33151 19-FEB-15 33885 Test, C
33151 19-FEB-15 33885 Test, C
SQL>