![]() |
| ||
|
|
Новости |
Поиск |
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 запросом?
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_