Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помощь в написании запроса  [new]
bamper78
Member

Откуда:
Сообщений: 122
Добрый день.

Прошу помощи, совета по написанию запроса, для меня не тривиального.

Имется
USE [Test_Alex]
GO

/****** Object:  Table [dbo].[logonLog]    Script Date: 11.11.2014 17:23:30 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[logonLog](
	[x_Time] [datetime] NULL,
	[x_UserName] [nvarchar](40) NULL
) ON [PRIMARY]

GO

USE [Test_Alex]
GO

INSERT INTO [dbo].[logonLog] VALUES ('2014-11-10 16:55:02.000',     'RKS2')
INSERT INTO [dbo].[logonLog] VALUES ('2014-11-10 16:55:02.000',	'RKS2')
INSERT INTO [dbo].[logonLog] VALUES ('2014-11-10 16:55:02.000',	'RKS2')
INSERT INTO [dbo].[logonLog] VALUES ('2014-11-10 16:55:02.000',	'RKS2')
INSERT INTO [dbo].[logonLog] VALUES ('2014-11-10 16:55:02.000',	'RKS2')
INSERT INTO [dbo].[logonLog] VALUES ('2014-11-10 17:41:42.000',	'RAVS4')
INSERT INTO [dbo].[logonLog] VALUES ('2014-11-10 17:41:42.000',	'RAVS4')
INSERT INTO [dbo].[logonLog] VALUES ('2014-11-10 17:41:43.000',	'RAVS4')
INSERT INTO [dbo].[logonLog] VALUES ('2014-11-10 17:41:43.000',	'RAVS4')
INSERT INTO [dbo].[logonLog] VALUES ('2014-11-10 17:41:43.000',	'RAVS4')
INSERT INTO [dbo].[logonLog] VALUES ('2014-11-10 16:30:02.000',      'RKS2')
INSERT INTO [dbo].[logonLog] VALUES ('2014-11-10 16:30:02.000',	'RKS2')
INSERT INTO [dbo].[logonLog] VALUES ('2014-11-10 16:30:02.000',	'RKS2')
INSERT INTO [dbo].[logonLog] VALUES ('2014-11-10 16:30:05.000',	'RKS2')
INSERT INTO [dbo].[logonLog] VALUES ('2014-11-10 16:30:05.000',	'RKS2')


x_Time x_UserName
2014-10-11 16:55:02.000 RKS2
2014-10-11 16:55:02.000 RKS2
2014-10-11 16:55:02.000 RKS2
2014-10-11 16:55:02.000 RKS2
2014-10-11 16:55:02.000 RKS2
2014-10-11 17:41:42.000 RAVS4
2014-10-11 17:41:42.000 RAVS4
2014-10-11 17:41:43.000 RAVS4
2014-10-11 17:41:43.000 RAVS4
2014-10-11 17:41:43.000 RAVS4
2014-10-11 16:30:02.000 RKS2
2014-10-11 16:30:02.000 RKS2
2014-10-11 16:30:02.000 RKS2
2014-10-11 16:30:03.000 RKS2
2014-10-11 16:30:03.000 RKS2

Требуется: запрос, который собирает кол-во входов по юзеру (x_UserName) за последние N часов

Вход юзера происходит через несколько сервисов, поэтому он авторизуется 5 раз, но это один юзер, по времени видно что это происходит в один момент. Но есть мометы когда когда секунды разняться.
11 ноя 14, 18:19    [16830448]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
bamper78,

если у вас дискретность вхождения не более 1 секунды, то вы рискуете склеить разные вхождения. В таких случаях используется какой-то глобальный идентификатор сеанса.
11 ноя 14, 18:28    [16830496]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21241
bamper78
Вход юзера происходит через несколько сервисов, поэтому он авторизуется 5 раз, но это один юзер

Строго 5 раз? тогда COUNT(ID)/5, и все дела... или всё-таки от 1 до 5 раз?
11 ноя 14, 18:36    [16830538]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
bamper78
Member

Откуда:
Сообщений: 122
Akina
bamper78
Вход юзера происходит через несколько сервисов, поэтому он авторизуется 5 раз, но это один юзер

Строго 5 раз? тогда COUNT(ID)/5, и все дела... или всё-таки от 1 до 5 раз?


я тоже так изначально решил, но все таки от 1 - 5, просто в примере так.
11 ноя 14, 18:50    [16830616]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
OmgFail
Member

Откуда:
Сообщений: 4
bamper78,

with cte 
as 
(
select x_time, 
       x_UserName, 
	   dd = datediff(second, x_time, lead(x_time, 1, getdate()) over (partition by x_UserName order by x_time)) 
from logonLog
)

select x_UserName, count(*) from cte
where dd > 1 
group by x_UserName
11 ноя 14, 20:26    [16831112]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21241
bamper78
все таки от 1 - 5

В таком случае требуется устойчиво отделить группу авторизаций. В приведённом тобой примере вполне может при глубоком анализе оказаться, что у RAVS4 это не одна аторизация в 5 сервисах. а 2 независимые авторизации, в 2 и 3 сервисах соответственно. Просто чисто случайно они прошли одновременно, с разницей в секунду... но это 2 разные копии клиентского приложения - а то и на 2 разных компьютерах... В общем, Владислав Колосов более чем прав.
11 ноя 14, 21:24    [16831351]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить