@NickelFace

Как составить запрос Tsql на отбор нахождение пользователя на рабочем месте?

5d38390ee1a64739242030.png
COMPUTER ( Computer_id PK int not null, --Id Com
Name varchar(255) not null ) --Name Com

USER ( User_id PK int not null, -- id пользователя Login varchar(255) not null , -- login users Name varchar(255) not null ) -- ФИО Users

S_EVENT ( Event_id PK int not null, --1,2,3,4 Name varchar(255) )-- Id События 1 Вкл ПК 2 Выкл ПК 3 Вход user 4 Выход user

EVENTS( Num int identity PK not null , -- Номер события Computer_id , -- Наследует из Computer User_id ,-- Наследует из User Event_id,--Наследует из Event date -- Сегодняшняя дата и время(Getdate()))

Задача Сформировать запрос,где будет 2 столбца

1 Это поле Name (ФИО Сотрудников)

2 Статус Компьютера ,где мы берём сравниваем

Если события за СЕГОДНЯ(завтра уже не должно работать) у данного пользователя (Event_id = 3) == (Event_id = 4),то "пользователь отошёл(обедает)"

Если события (Event_id = 3) > (Event_id = 4) у пользователя за всё время ,то " Пользователь работает"(он может работать со вчерашнего дня)

Если последнее событие (Event_id = 2) и (Event_id = 1) или User_id = null у пользователя ,то " Пользователя нет"(Значение у пользователя null в событиях 1 и 2,так как он ещё не зашёл в систему)
  • Вопрос задан
  • 81 просмотр
Решения вопроса 1
@NickelFace Автор вопроса
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
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
tsklab
@tsklab Куратор тега Transact-SQL
Здесь отвечаю на вопросы.
Выбрать пользователь, состояние из событий 
где момент = ( выбрать последний момент из событий для пользователя )
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы