MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.

Как выбрать первый вход для каждого пользователя в каждом дне?

Коллеги, доброе время суток.
прошу помощи коллективного разума =). Есть таблица с датами, временем и именем пользователя (регистрация входа в ПК). В течении дня 1 пользователь входит в сеть несколько раз - записей с 1 именем и 1 датой несколько. Таблица содержит данные за несколько дней.
Задача - получить список первых входов в каждом дне для каждого сотрудника.
Я попробовал реализовать это через курсор (по сути - через 2, по дням и по сотрудникам) - однако на выходе какая-то чушь получается.

DECLARE uName CURSOR FOR Select distinct LTRIM(RTRIM([Name])) AS NAME FROM [OVB].[dbo].[res] ORDER BY NAME
DECLARE @vDate datetime, @vName nvarchar(50)
OPEN uName
FETCH NEXT FROM uName INTO @vName
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE uDate CURSOR FOR Select distinct CONVERT(datetime, LEFT(CONVERT(VARCHAR, [Date], 103), 10)) FROM [OVB].[dbo].[res] WHERE LTRIM(RTRIM([Name]))=@vName
OPEN uDate
WHILE (@@FETCH_STATUS = 0)
BEGIN
FETCH NEXT FROM uDate INTO @vDate
INSERT INTO [OVB].[dbo].[PC_LOGIN] SELECT TOP 1 [Date],[Time],[Name] FROM [OVB].[dbo].[res] WHERE LTRIM(RTRIM([Name]))=@vName and CONVERT(datetime, LEFT(CONVERT(VARCHAR, [Date], 103), 10))=@vDate
END
CLOSE uDate
DEALLOCATE uDate
FETCH NEXT FROM uName
END
CLOSE uName
DEALLOCATE uName
  • Вопрос задан
  • 323 просмотра
Решения вопроса 2
@alisichkin
Программист
Курсоры зло.
begin tran

create table #res (
	ID int not null identity(1, 1),
	[Date] datetime not null,
	Name varchar(100) not null,
	constraint	PKres		primary	key	( Id )
)

insert #res ([Date], Name) values ('20150611 10:00', 'Пупкин')
insert #res ([Date], Name) values ('20150611 12:00', 'Пупкин')
insert #res ([Date], Name) values ('20150611 10:30', 'Иванов')

select dateadd(day, datediff(day, 0, [Date]), 0) [Day], min([Date]) Start, Name
from #res
group by dateadd(day, datediff(day, 0, [Date]), 0), Name
order by min([Date])

rollback
Ответ написан
lasalas
@lasalas
.NET Architect
SELECT uName, 
(
SELECT MIN(uDate) 
FROM Res 
WHERE uName = T.uName AND CAST(uDate AS Date) = D
) FirstDate
FROM 
(
SELECT DISTINCT uName, CAST(uDate AS Date) D
FROM Res
) T
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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