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

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

Возможно ли такое в SQL запросе


Страницы:   1 2

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 запросом?

Может и можно. Я не увидел СУБД, используемую тобой. Везде по-разному, а где-то и вообще не выйдет.


Страницы:   1 2

Наверх

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