Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


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

Есть список дат в 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, 19:55   #2
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 270
Репутация: 10
По умолчанию

Код:

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, 22:38   #3
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 270
Репутация: 10
По умолчанию

Код:

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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос на выборку и отчет на этот запрос 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


09:28.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru