Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.046 c
2-1154503790
Ivan Chuvashov
2006-08-02 11:29
2006.08.27
exe фаил


2-1154385873
Drashka
2006-08-01 02:44
2006.08.27
BlueTooth


6-1144846173
Jolik
2006-04-12 16:49
2006.08.27
Автоматическое обновление программы через интернет...


1-1152854018
AlexeyT
2006-07-14 09:13
2006.08.27
Библиотека RegEx с поиском в файлах?


15-1154002655
Desdechado
2006-07-27 16:17
2006.08.27
Любовь к жизни





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский