Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.27;
Скачать: CL | DM;

Вниз

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

 
DelphiN! ©   (2006-06-19 10:21) [0]

Есть таблица статистики запускаемых окон на компьютерах, следующей структуры :

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-19 10:26) [1]

Если в таблице отражено время создания окна, но не отражено время его уничтожения, то что ты считать будешь?
Количество запусков посчитать легко.
select ComputerName_,WindowCapture_,count(Time_)
from table_name
group by ComputerName_,WindowCapture_


 
DelphiN! ©   (2006-06-19 11:49) [2]


>  [1] Sergey13 ©   (19.06.06 10:26)


В таблице есть время создания окна, так вот я и написал, что если сделать выбор записей по одному компьютеру, и упрорядочеть записи по времени, то время открытия следующего окна будет примерно равно времени закрытия предыдущего


 
Sergey13 ©   (2006-06-19 11:55) [3]

> [2] DelphiN! ©   (19.06.06 11:49)
> то время открытия следующего
> окна будет примерно равно времени закрытия предыдущего

Да? Интересно почему? Там только какие то определенные окна, работающие по этому алгоритму?


 
MOA ©   (2006-06-19 11:57) [4]

Т.е. в приведённом Вами примере

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 открывается окно Caption1, затем оно закрывается и открывается снова, затем он закрывается и открывается Caption3.
Т.е. нет ситуации, когда не открыто ни оджного окна?
Так?


 
DelphiN! ©   (2006-06-19 12:17) [5]


>  [4] MOA ©   (19.06.06 11:57)


Да, нужно посчитать сколько времени было запущено каждое из всех окон


 
DelphiN! ©   (2006-06-19 12:18) [6]


> [4] MOA ©   (19.06.06 11:57)


Ситуации когда не открыто ниодно окно не существует


 
Sergey13 ©   (2006-06-19 12:20) [7]

2[5] DelphiN! ©   (19.06.06 12:17)
>Да, нужно посчитать сколько времени было запущено каждое из всех окон

Судя по всему
K1  Caption1 01.01.2006 02:00:00
Уже около полугода работает.


 
DelphiN! ©   (2006-06-19 12:24) [8]


>  [7] Sergey13 ©   (19.06.06 12:20)

> Судя по всему
> K1  Caption1 01.01.2006 02:00:00
> Уже около полугода работает.


Нет не работает, последнюю запись считать не надо, так как после нее записей нету, то и по формуле TimeSumm=TimeSumm+(TimeN+1-TimeN) не посчитаешь


 
Sergey13 ©   (2006-06-19 12:25) [9]

select ComputerName_,WindowCapture_,max(Time_)-min(Time_)
from table_name
group by ComputerName_,WindowCapture_

Это не то что надо?


 
MOA ©   (2006-06-19 12:27) [10]

Ну тогда на T-SQL что-то вроде

SELECT tn.ComputerName_, th.WindowCapture_,
SUM(DATEDIFF(s, tn.Time_, tn2.Time_) AS TotalSecond,
COUNT(*) AS TotalCall
FROM Tab_Name tn
INNER JOIN Tab_Name tn2
ON (tn2.ComputerName_ = tn.ComputerName_)
AND (tn2.Time_ = (SELECT MIN(tn3.Time_)
   FROM Tab_Name tn3
  WHERE (tn3.ComputerName_ = tn.ComputerName_)
   AND (tn3.Time_ > tn.Time_)))
GROUP BY tn.ComputerName_, tn.WindowCapture_

(не проверял!)
Удачи!


 
DelphiN! ©   (2006-06-19 12:27) [11]


> [7] Sergey13 ©   (19.06.06 12:20)

Упс, ошибся, после записи
K1                        Caption1               01.01.2006 02:00:00
Есть еще одна запись
K1                        Caption3               01.01.2006 03:00:00
Получается что
K1                        Caption1               01.01.2006 02:00:00
Проработала в данном случае ровно час


 
DelphiN! ©   (2006-06-19 13:02) [12]


> [9] Sergey13 ©   (19.06.06 12:25)


Немного переделал ваш код так:

select distinct WindowCapture_,max(Time_)-min(Time_)
from programs where TIME_ > "01.06.2006 00:00:00" group by WindowCapture_

А что делает Min и Max? Насколько я знаю они возвращают наименьшее и наибольшее значение из выборки, получается что результатом является значение последнего элемента минус значение первого, а это не правильно ... Ведь нужно значение текущего элемента минус значение предыдущего, при этом поля
ComputerName_  и   WindowCapture_ должны быть равны


 
Sergey13 ©   (2006-06-19 13:06) [13]

2[12] DelphiN! ©   (19.06.06 13:02)
Ты разберись со своей постановкой задачи.
>время открытия следующего окна будет примерно равно времени закрытия предыдущего
Это твои слова. Т.е. есть 10 записей на 1 окно. Зачем перебирать все? Ведь сумма промежутков между соседними будет равна промежутку между крайними. Или не так?


 
DelphiN! ©   (2006-06-19 13:16) [14]


>  [13] Sergey13 ©   (19.06.06 13:06)


Так ведь на компьютере не будут открывать одно и тоже окно все время, там будет так:

Id_   Что открыли               Время        
0     Окно1                     01:00:00      
1     Окно2                     02:00:00      
2     Окно3                     03:00:00      
3     Окно1                     04:00:00      
4     Окно2                     05:00:00      

Допустим чтобы расчитать сколько работало "Окно1" нужно

Win1TimeSumm := Время (1) - Время (0);
Win1TimeSumm := Win1TimeSumm+(  Время (4) - Время (3)  );
В итоге получим 2 часа.

Ваш способ делает следующее Время (3) - Время (0).
Получается 3 часа!(не правильно).

При этом наду учитывать что компьютеров много, и запись одного компьютера в неупорядоченой таблице следует под записью другого ...


 
DelphiN! ©   (2006-06-19 13:23) [15]


> [10] MOA ©   (19.06.06 12:27)


А что за функция DATEDIFF?


 
evvcom ©   (2006-06-19 13:25) [16]

> > Судя по всему
> > K1  Caption1 01.01.2006 02:00:00
> > Уже около полугода работает.
>
>
> Нет не работает, последнюю запись считать не надо,

Хорошо. Юзер закрыл окно и ушел в отпуск, а потом заболел. Долго болел, полгода. Потом вышел и снова открыл окно. И оказывается, что все это время окно работало?
И второе. А нафига вообще такая статистика?


 
evvcom ©   (2006-06-19 13:26) [17]

> и запись одного компьютера в неупорядоченой таблице следует
> под записью другого ...

М...м.м...м.м. Переведи.


 
DelphiN! ©   (2006-06-19 13:29) [18]


>  [16] evvcom ©   (19.06.06 13:25)


Когда пользователь болеет, у него открывается окошко, имя которого я не учитываю.

Чтобы знать какой программе люди посвящают сколько времени


 
DelphiN! ©   (2006-06-19 13:32) [19]


>  [17] evvcom ©   (19.06.06 13:26)


Например

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

Тут присутствуют данные двух компьютеров K1 и K2, их естественно нужно как то отделять и счтать по отдельности,
чтобы не получалось, что один работает с одним окном, а на другом компьютере запустили другое окно, и программа в статистику отразило будто первый компьютер закрыл окно на своем компе, хотя это сделал другой ... %)


 
evvcom ©   (2006-06-19 13:39) [20]

> [19] DelphiN! ©   (19.06.06 13:32)

Для этого есть ORDER BY ComputerName_, Time_, а то что ты считаешь, что записи будут расположены в порядке возрастания по времени, ты глубоко заблуждаешься.

> Может это можно сделать одним SQL запросом?

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


 
MOA ©   (2006-06-19 13:41) [21]

>А что за функция DATEDIFF?
Возвращает разницу двух аргуиентов типа Datetime. В данном случае (кстати, скобку я там пропустил)
DATEDIFF(s, tn.Time_, tn2.Time_)
возвращает к-во секунд (s) прошедших с tn.Time_ до tn2.Time_


 
DelphiN! ©   (2006-06-19 13:52) [22]


>  [20] evvcom ©   (19.06.06 13:39)
а то что ты считаешь, что записи будут расположены в порядке возрастания по времени, ты глубоко заблуждаешься.


Так ведь должны идти по возрастанию времени ведь в order by поле time_ включено

СУБД FireBird 1.5


 
DelphiN! ©   (2006-06-19 13:54) [23]


>  [21] MOA ©   (19.06.06 13:41)


А мне ругается, мол DATEDIFF function unknown ... :(


 
sniknik ©   (2006-06-19 13:58) [24]

> А мне ругается, мол DATEDIFF function unknown ... :(
после вот этого
> СУБД FireBird 1.5
можеш все сначала начинать, все что "советовалось" до, недействительно.


 
DelphiN! ©   (2006-06-19 14:00) [25]


>  [24] sniknik ©   (19.06.06 13:58)


:(( Не знал что различия в SQL с другими субд настолько существенны ...


 
evvcom ©   (2006-06-19 14:01) [26]

> Так ведь должны идти по возрастанию времени ведь в order
> by поле time_ включено

Где? Я не увидел ни одного запроса от твоего имени с order by.

> СУБД FireBird 1.5

Вот тут я тебе особо не советчик. Но сделать можно. Сейчас асы FB чего-нить насоветуют.


 
MOA ©   (2006-06-19 14:01) [27]

>DATEDIFF function unknown ...
И неудивительно - скрипт был для T-SQL ;). Поищите её аналог в FireBird.


 
evvcom ©   (2006-06-19 14:04) [28]

> [24] sniknik ©   (19.06.06 13:58)

:-))))

> [25] DelphiN! ©   (19.06.06 14:00)

Вот видишь, сколько времени потрачено впустую. С типа СУБД и надо всегда начинать. А то пальцем в ... небо натыкали. :)


 
sniknik ©   (2006-06-19 14:07) [29]

> :(( Не знал что различия в SQL с другими субд настолько существенны ...
а галочки с указанием сервера при посте вопроса думаеш администрация сайта просто так прдумала? поиздеваться над бедными пользователями сайта.


 
DelphiN! ©   (2006-06-19 14:12) [30]


> [29] sniknik ©   (19.06.06 14:07)


А у меня DmClient v2.8, и в нем галочек с выбором СУБД не наблюдается, только с выбором ОС :((


 
DelphiN! ©   (2006-06-19 14:20) [31]


> [29] sniknik ©   (19.06.06 14:07)


А сам забыл указать ...


 
Sergey13 ©   (2006-06-19 15:10) [32]

2[14] DelphiN! ©   (19.06.06 13:16)
>Так ведь на компьютере не будут открывать одно и тоже окно все время, там будет так:
Вот у меня практически всегда открыты Делфи, ДМКлиент, браузер, ТоталКомандир и ПЛ/СКЛ Девелопер. Т.е. пришел на работу - пооткрывал, перед уходом - закрыл. Сколько же я работал в какой программе?


 
evvcom ©   (2006-06-19 15:22) [33]

> Т.е. пришел на работу - пооткрывал, перед уходом - закрыл.

А я и вовсе комп не выключаю, и ничего не закрываю/открываю. Только при перезагрузах или тоталглюках.


 
Sergey13 ©   (2006-06-19 15:28) [34]

> [33] evvcom ©   (19.06.06 15:22)
> А я и вовсе комп не выключаю, и ничего не закрываю/открываю.
> Только при перезагрузах или тоталглюках.

Вот и посчитают, что ты и не работаешь вовсе. 8-) Впрочем как и я. 8-(


 
evvcom ©   (2006-06-19 15:58) [35]

> [34] Sergey13 ©   (19.06.06 15:28)
> Вот и посчитают, что ты и не работаешь вовсе. 8-) Впрочем
> как и я. 8-(

А потом появится заметка в газете:
"Коллектив предприятия такого-то выражает соболезнования по поводу безвременной кончины программиста ..." :)


 
saxon   (2006-06-19 17:28) [36]


> Sergey13 ©   (19.06.06 15:10) [32]
> evvcom ©   (19.06.06 15:22) [33]

Интересно, а если еще и Hibernate? ;)


 
DelphiN! ©   (2006-06-20 06:18) [37]

Программа должна контролировать играбельность определенных игр в интернет кафе, после закрытия времени клиентом компьютер блокируется и на передний план выходит окно, заголовок которого я не учитываю в статистике ...


 
DelphiN! ©   (2006-06-20 06:19) [38]


> [32] Sergey13 ©   (19.06.06 15:10)


У вас может быть сколько угодно открытых окон, программа же определяет заголовок именно активного окна, а при его смене снова заносит новый заголовок в статистику


 
Sergey13 ©   (2006-06-20 09:02) [39]

2[38] DelphiN! ©   (20.06.06 06:19)
Упрости себе задачу. В момент записи нового окна пиши тоже время в запись предыдущего как "время окончания". Иначе может и можно извратиться обычным запросом, но сложно и наверняка затратно по времени.



Страницы: 1 вся ветка

Текущий архив: 2006.08.27;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.046 c
15-1154061799
Гостья из прошлого
2006-07-28 08:43
2006.08.27
С Днём системного администратора!


3-1150731490
rar
2006-06-19 19:38
2006.08.27
Хранимая процеддура


2-1154612736
yon
2006-08-03 17:45
2006.08.27
Прорисовка в StringGrid


15-1154510916
SPeller
2006-08-02 13:28
2006.08.27
Глюк IE. Помогите, кто чем может


3-1150698066
DelphiN!
2006-06-19 10:21
2006.08.27
Возможно ли такое в SQL запросе