powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос - пользоавтели с самыми недавними по времени доступами к ресурсу
6 сообщений из 6, страница 1 из 1
Запрос - пользоавтели с самыми недавними по времени доступами к ресурсу
    #39689953
Vladimir SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите пожалуйста составить запрос -
есть две таблицы - одна Users(USER_ID, FIRST_NAME, LAST_NAME, PHONE), вторая USER_LOG(USER_ID, ACCESS_TIME)
Помогите выбрать 20 последних пользователей которые использовали ресурсы.
Загранее спасибо!
...
Рейтинг: 0 / 0
Запрос - пользоавтели с самыми недавними по времени доступами к ресурсу
    #39689956
Vladimir SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Учитывая сто один и тот же пользователь как правило несколько раз стучиться к ресурсу - то есть для каждого в таблице USAGE_LOG несколько записей
...
Рейтинг: 0 / 0
Запрос - пользоавтели с самыми недавними по времени доступами к ресурсу
    #39689966
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir SQL,

Вариант 1, для всех юзеров мы найдем последнюю запись, и после этого покажем только 20 юзеров
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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



Вот еще вариант, не полностью решает поставленную задачу, но вероятно более производительный. Если у вас ооочень много юзеров в таблице.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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
...
Рейтинг: 0 / 0
Запрос - пользоавтели с самыми недавними по времени доступами к ресурсу
    #39689967
Соединить данные таблиц, пронумеровать с помощью ROW_NUMBER(). Взять первые 20 записей - SELECT TOP(20).
...
Рейтинг: 0 / 0
Запрос - пользоавтели с самыми недавними по времени доступами к ресурсу
    #39689968
Соединить данные таблиц, пронумеровать с помощью ROW_NUMBER(). Взять первые 20 записей - SELECT TOP(20).
...
Рейтинг: 0 / 0
Запрос - пользоавтели с самыми недавними по времени доступами к ресурсу
    #39689978
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собиратель мифовСоединить данные таблиц, пронумеровать с помощью ROW_NUMBER(). Взять первые 20 записей - SELECT TOP(20).
- И?..
- И сервер ляжет...
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос - пользоавтели с самыми недавними по времени доступами к ресурсу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]