Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2018, 15:14   #1
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию Запрос запрос интервал.

Есть список дат в utc формате, в виде чисел - пример 1474154412.

Возможно ли сделать так, если да то как?

Из всего множества дат, взять последних 7 дней. И по каждому дню составить средний интервал между двумя ближайшими датами?

День 1 например
1474154412
1474154412
1474154414
1474154417

среднее между двумя ближайшими датами по первому дню
1474154417 - 1474154414 = 3
1474154414 - 1474154412 = 2
1474154412 - 1474154412 = 0
И взять среднее 1.6666 с округлением в большую сторону = 2.
День первый среднее = 2

Взять следующий день и также сделать, итак 7 дней. На выходе получить 7 значений по каждому дню среднее. Как такое придумать?
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 17.02.2018, 18:55   #2
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Код:
SELECT ROUND(AVG(T1.log_time - T.log_time)) AS avg_request
            FROM apache_logs AS T
            INNER JOIN apache_logs AS T1 ON T1.id = T.id + 1
Начало положено, теперь надо как то по интервально сделать по дням, как бы прикрутить?
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 17.02.2018, 21:38   #3
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Код:
DELIMITER //
CREATE PROCEDURE time_request ()
begin

    DECLARE period INT DEFAULT 7;
    DECLARE days INT DEFAULT 0;
	DECLARE max_log_time INT DEFAULT 0;
    DECLARE min_log_time INT DEFAULT 0;
    
	SET max_log_time = (SELECT MAX(log_time) FROM apache_logs);
    SET min_log_time = max_log_time - 86400;
    
	WHILE days < period DO
         SELECT ROUND(AVG(B.log_time - A.log_time)) AS avg_request, COUNT(A.log_time) AS count_request, SUM(CASE WHEN A.code = '404' THEN 1 ELSE 0 END), min_log_time, max_log_time
                FROM apache_logs AS A
                INNER JOIN apache_logs AS B ON B.id = A.id + 1
                WHERE A.log_time BETWEEN min_log_time AND max_log_time;
         SET days = days + 1;
         SET max_log_time = max_log_time - 1 - 86400;
         SET min_log_time = max_log_time - 86400;
	END WHILE;
    
end
//


Смог только процедурой такое реализовать, можно как то запросом чисто обойтись? и вообще адекватность данного кода можете оценить(как бы улучшить там)?
a.n.o.n.i.m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос на выборку и отчет на этот запрос Camelot_2012 Microsoft Office Access 2 21.12.2011 16:48
Запрос с CASE переделать в запрос с PIVOT (MS SQL Server 2005) Машуля SQL, базы данных 4 06.05.2010 21:09
запрос ссылается на несвязанный с ним запрос kolebatel SQL, базы данных 0 11.06.2008 12:50
Запрос Инночка БД в Delphi 1 01.05.2008 23:46