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

Откуда:
Сообщений: 2
Помогите пожалуйста составить запрос -
есть две таблицы - одна Users(USER_ID, FIRST_NAME, LAST_NAME, PHONE), вторая USER_LOG(USER_ID, ACCESS_TIME)
Помогите выбрать 20 последних пользователей которые использовали ресурсы.
Загранее спасибо!
19 авг 18, 13:23    [21647154]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - пользоавтели с самыми недавними по времени доступами к ресурсу  [new]
Vladimir SQL
Member

Откуда:
Сообщений: 2
Учитывая сто один и тот же пользователь как правило несколько раз стучиться к ресурсу - то есть для каждого в таблице USAGE_LOG несколько записей
19 авг 18, 13:25    [21647157]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - пользоавтели с самыми недавними по времени доступами к ресурсу  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
Vladimir SQL,

Вариант 1, для всех юзеров мы найдем последнюю запись, и после этого покажем только 20 юзеров
select top 20 *
from dbo.Users u
	cross apply ( 
		select *
		from dbo.User_Log l
		where l.User_Id = u.User_Id
		order by ACCESS_TIME desc
	) ul
order by ACCESS_TIME desc 
go
-- для этого варианта должен иметься следующий индекс
create index IDX_UserLog_UserID_AccessTime on dbo.User_Log ( User_Id, ACCESS_TIME desc ) -- можно без desc
go


Вот еще вариант, не полностью решает поставленную задачу, но вероятно более производительный. Если у вас ооочень много юзеров в таблице.
with cteData
as (
	select User_Id, max(ACCESS_TIME) as ACCESS_TIME
	from (
		-- для оптимизации вытащим последние 1000 записей
		select top 1000 *
		from dbo.User_Log
		order by ACCESS_TIME desc
	) t
	group by User_Id
)
-- тут может быть меньше 20 строк
select top 20 *
from dbo.Users u
	join cteData d on d.User_Id = u.User_id
order by ACCESS_TIME

-- для этого варианта должен иметься следующий индекс
create index IDX_UserLog_AccessTime on dbo.User_Log ( ACCESS_TIME desc ) include ( User_Id ) -- можно без desc
go
19 авг 18, 13:45    [21647170]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - пользоавтели с самыми недавними по времени доступами к ресурсу  [new]
Собиратель мифов
Member

Откуда:
Сообщений: 10
Соединить данные таблиц, пронумеровать с помощью ROW_NUMBER(). Взять первые 20 записей - SELECT TOP(20).
19 авг 18, 13:46    [21647171]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - пользоавтели с самыми недавними по времени доступами к ресурсу  [new]
Собиратель мифов
Member

Откуда:
Сообщений: 10
Соединить данные таблиц, пронумеровать с помощью ROW_NUMBER(). Взять первые 20 записей - SELECT TOP(20).
19 авг 18, 13:48    [21647172]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - пользоавтели с самыми недавними по времени доступами к ресурсу  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
Собиратель мифов
Соединить данные таблиц, пронумеровать с помощью ROW_NUMBER(). Взять первые 20 записей - SELECT TOP(20).

- И?..
- И сервер ляжет...
19 авг 18, 14:12    [21647184]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить