Something like this? The LASTNAME, FIRSTNAME and USERKEY may be redundant, but that will be for you to figure-out.
Don't run this without testing it. First run the inner-most SELECT and see if the results are reasonable. Then run the next-higher SELECT and check those results. Then, run the SELECT with the * and see if those are the records you are expecting to delete. If so, you can then run the whole thing.
Code:
delete YT
--select *
from YourTable YT
inner
join (
select Step1.LASTNAME
,Step1.FIRSTNAME
,Step1.USERKEY
max(ID) MaxOfID
from (
select LASTNAME
,FIRSTNAME
,USERKEY
count(*) CountOfLASTNAME
from YourTable
group
by LASTNAME
,FIRSTNAME
,USERKEY
having count(*)<>1
) Step1
group
by Step1.LASTNAME
,Step1.FIRSTNAME
,Step1.USERKEY
) Step2 on
YT.ID=Step2.MaxOfID