![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL по выводу постоянных пользователей [FireBird 1.5]
DelphiN! © (2007-10-19 12:45:00)Есть таблицы CASEBASE и USERS
с полями
таблица: CASEBASE
Поля: UserName_ Time_
Содержит: список всех операций пользователей
UserName_ - имя пользователя
Time_ - время начала операции
-----------
Таблица: Users
Поля: UserName_ RegistredTime_
Содержит: Время регистрации каждого пользователя
UserName_ имя пользователя
RegistredTime_ время регистрации
------------------
Необходимо вывести список пользователей,которые сделали более 2х операций за период времени, при этом время регистрации пользователей, попадающих под условие должно быть более 30ти дней от времени операции
Вот что у меня получилось :
SELECT UserName_,
count (distinct EXTRACT(DAY FROM Time_)||'.'||EXTRACT(MONTH FROM Time_)||'.'||EXTRACT(YEAR FROM Time_))
FROM CaseBase WHERE (TIME_ > '15.08.2007')and(TIME_ < '15.09.2007')and (exists (select REGISTREDTIME_ from users where (casebase.UserName_ = users.UserName_)and((casebase.time_ - users.registredtime_)>30)))
GROUP BY cardno_
having count (distinct EXTRACT(DAY FROM Time_)||'.'||EXTRACT(MONTH FROM Time_)||'.'||EXTRACT(YEAR FROM Time_)) > 2
ORDER BY 2
Однако данный запрос выводит пустоту, где у меня ошибка?
Sergey13 (2007-10-19 13:19:00) [21]> [0] DelphiN! © (19.10.07 12:45)
Может я не вник в суть, но зачем вычислять
count (distinct EXTRACT(DAY FROM Time_)||'.'||EXTRACT(MONTH FROM Time_)||'.'||EXTRACT(YEAR FROM Time_))
вместо просто count(*) если надо просто посчитать количество операций?
DelphiN! (2007-10-19 13:17:00) [22]
> Маша Шрайбер © (19.10.07 13:12) [2]
Упс, извеняюсь, просто на форуме изменил реальные названия на более понятные, и вконце забыл
SELECT UserName_,
count (distinct EXTRACT(DAY FROM Time_)||'.'||EXTRACT(MONTH FROM Time_)||'.'||EXTRACT(YEAR FROM Time_))
FROM CaseBase WHERE (TIME_ > '15.08.2007')and(TIME_ < '15.10.2007')and (exists (select REGISTREDTIME_ from users where (casebase.UserName_ = users.UserName_)and((casebase.time_ - users.registredtime_)>30)))
GROUP BY UserName_
having count (distinct EXTRACT(DAY FROM Time_)||'.'||EXTRACT(MONTH FROM Time_)||'.'||EXTRACT(YEAR FROM Time_)) > 2
ORDER BY 2
Маша Шрайбер (2007-10-19 13:12:00) [23]А запрос-то вообще работает? Ведь как-то странно, выборка одного поля, группировка по другому.
DelphiN! (2007-10-19 13:11:00) [24]Разобрался, у меня интервал времени был неверно указан просто ...
Тогда другой вопрос. Данный SQL выполняется очень долго, как можно его ускорить?