Вы точно не описали логи c, которые вы хотите реализовать.
Я понимаю, что для каждого EmpPk
вам нужны записи, где attendance_status = 'Attended' and registration_status = 'Completed'
; если такой записи нет, вам нужны все остальные записи.
Если это так, вы можете написать это с помощью not exists
:
select t.*
from employee_activity ea
where
(
ea.attendance_status = 'Attended'
and ea.registration_status = 'Completed'
) or not exists (
select 1
from employee_activity ea1
where
ea1.empPk = ea.empPk
and ea1.attendance_status = 'Attended'
and ea1.registration_status = 'Completed'
)
Вы также можете использовать оконные функции:
select *
from (
select
t.*,
rank() over(
partition by empPk
order by case when attendance_status = 'Attended' and registration_status = 'Completed' then 1 else 2 end
) rn
from employee_activity
) t
where rn = 1
Предложение order by
оконной функции rank()
ставит «завершенную» запись каждого сотрудника первой; затем внешний фильтр запросов в верхних рейтинговых записях на сотрудника (если нет «полной» записи, тогда все остальные записи того же клиента будут ранжироваться первыми).