select u.[User_Id] , [Name] , [state] , [date]
from [USER] u
join (
--соединим полученный результат с ФИО
select tt.User_Id , isnull([state], 2) [state], [date]
-- выбираем всех пользователей ,а значения нал заменим на 2
from
(
select e.User_Id ,min(Event_id) as [state], [date]
from EVENTS e
join
(
select max([Num]) num,Computer_Id
from EVENTS
group by Computer_Id
) t1 on
t1.num = e.Num
where User_Id is not null
group by e.User_Id , [date]
--Последние действие пользователя если был вход или выход
union
---------------------------------------Последнее действие на компьютере пользователя и компьютера
select User_Id , Ev_id , dt
from
(
select num as num1, e.Computer_Id as CID, [USER_ID] as Us_id ,Event_Id as Ev_id , Date as dt
from EVENTS e
join
(
select max(num) nam,Computer_Id
from EVENTS
group by Computer_Id
) t2 on
t2.nam = e.Num
where User_Id is null
) as
tnull
inner join
(
select e.Num , e.Computer_Id , e.User_Id , Event_Id , [Date]
from EVENTS e
join
(
select max(num) num,User_Id
from EVENTS
where User_Id is not null
group by User_Id
) muser on
muser.num = e.Num
--order by Computer_Id
) as euser on
euser.Computer_Id = tnull.CID
--Последние дествие на компьютере выкл/вкл ПК и пред действие пользователя на этом ПК(выход) ,но выводим только Пользователя и текущий статус ПК
) tt1
-----------------------------------------------------
right join
(
Select u.[User_Id]
from [USER] u) tt on
tt.User_Id = tt1.User_Id
--выявляем оставшихся пользователей (те кто не попали будут со значением NULL)
) t1 on t1.User_Id = u.User_Id