Форум: "Базы";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
Вниз
Возможно ли такое в 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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.044 c