Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Задачка ;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)


Наверх

Титульная страница Поиск, карта сайта Написать письмо