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


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


>  [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, их естественно нужно как то отделять и счтать по отдельности,
чтобы не получалось, что один работает с одним окном, а на другом компьютере запустили другое окно, и программа в статистику отразило будто первый компьютер закрыл окно на своем компе, хотя это сделал другой ... %)


DelphiN!   (2006-06-19 13:29:00) [22]


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


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

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


evvcom   (2006-06-19 13:26:00) [23]

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

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


evvcom   (2006-06-19 13:25:00) [24]

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

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


DelphiN!   (2006-06-19 13:23:00) [25]


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


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


DelphiN!   (2006-06-19 13:16:00) [26]


>  [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 часа!(не правильно).

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


Sergey13   (2006-06-19 13:06:00) [27]

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


DelphiN!   (2006-06-19 13:02:00) [28]


> [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_ должны быть равны


DelphiN!   (2006-06-19 12:27:00) [29]


> [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
Проработала в данном случае ровно час


MOA   (2006-06-19 12:27:00) [30]

Ну тогда на 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_

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


Sergey13   (2006-06-19 12:25:00) [31]

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

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


DelphiN!   (2006-06-19 12:24:00) [32]


>  [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:20:00) [33]

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

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


DelphiN!   (2006-06-19 12:18:00) [34]


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


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


DelphiN!   (2006-06-19 12:17:00) [35]


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


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


MOA   (2006-06-19 11:57:00) [36]

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

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


Sergey13   (2006-06-19 11:55:00) [37]

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

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


DelphiN!   (2006-06-19 11:49:00) [38]


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


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


Sergey13   (2006-06-19 10:26:00) [39]

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


Страницы:   1 2

Наверх

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