Следующее сделает это за вас. Я использую пару вложенных CTE. Первый выполняет ваши преобразования данных, второй устанавливает минимальное и максимальное время, а последний запрос устанавливает пустые все строки, в которых отсутствуют записи I.
В данных теста используются переменные таблицы для ваших таблиц Table1 и Table2.
declare @E table(Entries varchar(50), RecordDate varchar(50), EmpID varchar(6), Ref int)
insert @e values ('0016930507201907:35I','2019-05-07 00:00:00 000','001693',1693)
,('0016930507201917:06O','2019-05-07 00:00:00 000','001693',1693)
,('0016930507201907:35I','2019-05-08 00:00:00 000','001693',1693)
,('','2019-05-08 00:00:00 000','001693',1693)
declare @B table(LastName varchar(50),FirstName varchar(50),middleName varchar(50),EmployeeNO varchar(6))
insert @B values ('Cruz','Kimberly','Castillo','001693')
;with e as (
select right(Entries,1) as InOut,
convert(datetime,left(recorddate,10)) as RecordDate, Entries,
substring(Entries,15,5) as t,
EmpID
from @e
where len(ltrim(Entries))>0
)
, details as (
select B.LastName + ',' + B.FirstName + ',' + B.MiddleName [Name],
EmployeeNO,
RecordDate,
min(case when InOut='I' then T else '99:99' end) as I,
max(case when InOut='O' then T else '' end) as O
from @B B
join e on e.EmpID=B.EmployeeNO
group by B.LastName,B.FirstName,B.MiddleName,EmployeeNO,RecordDate
)
select Name, EmployeeNO, RecordDate, case when I='99:99' then '' else I end as TimeIn, O as TimeOut
from details