![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Задачка ;SQL-щикам! Возможно ли следующее одним SQL запросом..
Vorobyev Sergey © (2003-07-25 15:13:00)Привет всем!
Есть таблица ведения лога польователей (зашел, вышел) (ЭТО ТОЛЬКО ПРИМЕР)
----------------------------------------------
name action date
----------------------------------------------
alex enter 8:00
maxim enter 8:15
alex quit 8:30
den enter 9:00
sega enter 9:02
mega enter 9:15
sega quit ( без использования хранимых процедур)
Привет всем!
Есть таблица ведения лога польователей (зашел, вышел) (ЭТО ТОЛЬКО ПРИМЕР)
----------------------------------------------
name action date
----------------------------------------------
alex enter 8:00
maxim enter 8:15
alex quit 8:30
den enter 9:00
sega enter 9:02
mega enter 9:15
sega quit 9:30
и т.д.
----------------------------------------------
ВОПРОС:
1. Возможно ли одним запросом (без использования хранимых процедур) получить список работающих пользователей на конкретное время, т.е. например на 9:01 это будет:
----------------------------------------------
name action date
----------------------------------------------
maxim enter 8:15
den enter 9:00
----------------------------------------------
2. Если это возможно, то не будет ли этот запрос долго-исполняемым, например для таблицы с 100000 записей
--
Спасибо
к (2003-07-28 14:14:00) [1]
у
Соловьев (2003-07-28 10:12:00) [2]
Сорри за не точный ответ, вот такой должен работать:
select t1.name, max(t1."date")
from test t1
where t1."date">=need_date
group by t1.name
having (count(t1.action)<2)
ZrenBy (2003-07-25 16:39:00) [3]
2 select
select L.name, L.date from log_table L
inner join
(
select name, date = max(date) from log_table where date < :rd group by name
)T
on T.name = L.name and T.date=L.date
where L.code = "enter"
Vorobyev Sergey (2003-07-25 16:16:00) [4]
Корректировка..
Этот запрос - для текущего момента времени, ну а для любого конкретного момента времени просто надо добавить
... where code="enter" and date<:required_date
group by name..
, то же для внутреннего подзапроса
Vorobyev Sergey (2003-07-25 16:11:00) [5]Вот, я сам решил задачу без EXISTS
И запрос выполняется быстро..
select name, max(date) from log_table a
where code="enter"
group by name
having
(max(date) > (select max(date) from log_table a2
( select max(date)
Вот, я сам решил задачу без EXISTS
И запрос выполняется быстро..
select name, max(date) from log_table a
where code="enter"
group by name
having
(max(date) > (select max(date) from log_table a2
where code="quit" and a2.name = a.name))
or
(select max(date) from log_table a2
where code="quit" and a2.name = a.name) is null
Reindeer Moss Eater (2003-07-25 16:02:00) [6]
И что же оно покажет?
Последние логоны клиентов, произошедшие после какого-то момента времени?
Как это к вопросу относится?
Соловьев (2003-07-25 15:51:00) [7]
select name, max(date)
from t1
where action<>"quit" and date>need_date
group by name
Vorobyev Sergey (2003-07-25 15:32:00) [8]
> Reindeer Moss Eater (25.07.03 15:22)
Спасибо!
Вся фишка была в EXISTS:-)
ВЫВОД: надо хорошо знать SQL
P.S. Правда этот запрос выполняется долго, мой вариант с хранимыми процедурами работает быстрее
Reindeer Moss Eater (2003-07-25 15:22:00) [9]
select * from Table T1
where T1.action = "enter" and T1.date < Needed_Date
and not exists(select null from Table T2 where T2.action = "quit" and T2.Date > T1.Date and T2.Name = T1.Name)