![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Возможно ли такое в SQL запросе
DelphiN! © (2006-06-19 10:21:00)Есть таблица статистики запускаемых окон на компьютерах, следующей структуры :
ComputerName_ WindowCapture_ Time_
K1 Caption1 01.01.2006 01:00:01
K2 Caption2 01.01.2006 01:00:02
K1 Caption1 01.01.2006 02:00:00
K1 Caption3 01.01.2006 03:00:00
Необходимо вывести колличество уникальных записей. С этим понятно.
Также необходимо посчитать сколько времени в общем было запущено каждое окно. В голову приходит только выбор всех записей, а далее делать так :
1)Выбираем все записи по первому компьютеру
2) Переходим на запись и запоминаем имя и время записи
3)Переходим на следующую запись и проверяем не равно ли имя записи имени предыдущей записи
4) Если не равно то прибавляем к счетчику асоциированному с именем окна в предыдущей записи разницу времени между текущим временем и предыдущим.
В итоге мы должны найти :
Время работы с каждым окном, а также колличество запусков каждого окна
WindowName_ SummOfTime_ UnicalCount_
Caption1 01:00:01 2
... ... ...
Описаный мною способ работает, НО работает недопустимо медленно, так как запросов необходимо сделать столько, сколько уникальных имен компьютеров в таблице, а далее еще и перебрать все таблицу.
Как ускорить подсчет данных? Может это можно сделать одним SQL запросом?
Sergey13 (2006-06-20 09:02:00) [1]2[38] DelphiN! © (20.06.06 06:19)
Упрости себе задачу. В момент записи нового окна пиши тоже время в запись предыдущего как "время окончания". Иначе может и можно извратиться обычным запросом, но сложно и наверняка затратно по времени.
DelphiN! (2006-06-20 06:19:00) [2]
> [32] Sergey13 © (19.06.06 15:10)
У вас может быть сколько угодно открытых окон, программа же определяет заголовок именно активного окна, а при его смене снова заносит новый заголовок в статистику
DelphiN! (2006-06-20 06:18:00) [3]Программа должна контролировать играбельность определенных игр в интернет кафе, после закрытия времени клиентом компьютер блокируется и на передний план выходит окно, заголовок которого я не учитываю в статистике ...
saxon (2006-06-19 17:28:00) [4]
> Sergey13 © (19.06.06 15:10) [32]
> evvcom © (19.06.06 15:22) [33]
Интересно, а если еще и Hibernate? ;)
evvcom (2006-06-19 15:58:00) [5]> [34] Sergey13 © (19.06.06 15:28)
> Вот и посчитают, что ты и не работаешь вовсе. 8-) Впрочем
> как и я. 8-(
А потом появится заметка в газете:
"Коллектив предприятия такого-то выражает соболезнования по поводу безвременной кончины программиста ..." :)
Sergey13 (2006-06-19 15:28:00) [6]> [33] evvcom © (19.06.06 15:22)
> А я и вовсе комп не выключаю, и ничего не закрываю/открываю.
> Только при перезагрузах или тоталглюках.
Вот и посчитают, что ты и не работаешь вовсе. 8-) Впрочем как и я. 8-(
evvcom (2006-06-19 15:22:00) [7]> Т.е. пришел на работу - пооткрывал, перед уходом - закрыл.
А я и вовсе комп не выключаю, и ничего не закрываю/открываю. Только при перезагрузах или тоталглюках.
Sergey13 (2006-06-19 15:10:00) [8]2[14] DelphiN! © (19.06.06 13:16)
>Так ведь на компьютере не будут открывать одно и тоже окно все время, там будет так:
Вот у меня практически всегда открыты Делфи, ДМКлиент, браузер, ТоталКомандир и ПЛ/СКЛ Девелопер. Т.е. пришел на работу - пооткрывал, перед уходом - закрыл. Сколько же я работалв какой программе?
DelphiN! (2006-06-19 14:20:00) [9]
> [29] sniknik © (19.06.06 14:07)
А сам забыл указать ...
DelphiN! (2006-06-19 14:12:00) [10]
> [29] sniknik © (19.06.06 14:07)
А у меня DmClient v2.8, и в нем галочек с выбором СУБД не наблюдается, только с выбором ОС :((
sniknik (2006-06-19 14:07:00) [11]> :(( Не знал что различия в SQL с другими субд настолько существенны ...
а галочки с указанием сервера при посте вопроса думаеш администрация сайта просто так прдумала? поиздеваться над бедными пользователями сайта.
evvcom (2006-06-19 14:04:00) [12]> [24] sniknik © (19.06.06 13:58)
:-))))
> [25] DelphiN! © (19.06.06 14:00)
Вот видишь, сколько времени потрачено впустую. С типа СУБД и надо всегда начинать. А то пальцем в ... небо натыкали. :)
MOA (2006-06-19 14:01:00) [13]>DATEDIFF function unknown ...
И неудивительно - скрипт был для T-SQL ;). Поищите её аналог в FireBird.
evvcom (2006-06-19 14:01:00) [14]> Так ведь должны идти по возрастанию времени ведь в order
> by поле time_ включено
Где? Я не увидел ни одного запроса от твоего имени с order by.
> СУБД FireBird 1.5
Вот тут я тебе особо не советчик. Но сделать можно. Сейчас асы FB чего-нить насоветуют.
DelphiN! (2006-06-19 14:00:00) [15]
> [24] sniknik © (19.06.06 13:58)
:(( Не знал что различия в SQL с другими субд настолько существенны ...
sniknik (2006-06-19 13:58:00) [16]> А мне ругается, мол DATEDIFF function unknown ... :(
после вот этого
> СУБД FireBird 1.5
можеш все сначала начинать, все что "советовалось" до, недействительно.
DelphiN! (2006-06-19 13:54:00) [17]
> [21] MOA © (19.06.06 13:41)
А мне ругается, мол DATEDIFF function unknown ... :(
DelphiN! (2006-06-19 13:52:00) [18]
> [20] evvcom © (19.06.06 13:39)
а то что ты считаешь, что записи будут расположены в порядке возрастания по времени, ты глубоко заблуждаешься.
Так ведь должны идти по возрастанию времени ведь в order by поле time_ включено
СУБД FireBird 1.5
MOA (2006-06-19 13:41:00) [19]>А что за функция DATEDIFF?
Возвращает разницу двух аргуиентов типа Datetime. В данном случае (кстати, скобку я там пропустил)
DATEDIFF( s, tn.Time_, tn2.Time_)
возвращает к-во секунд ( s) прошедших с tn.Time_ до tn2.Time_
evvcom (2006-06-19 13:39:00) [20]> [19] DelphiN! © (19.06.06 13:32)
Для этого естьORDER BY ComputerName_, Time_, а то что ты считаешь, что записи будут расположены в порядке возрастания по времени, ты глубоко заблуждаешься.
> Может это можно сделать одним SQL запросом?
Может и можно. Я не увидел СУБД, используемую тобой. Везде по-разному, а где-то и вообще не выйдет.