2012-03-15 3 views
1

Я пытаюсь вычислить процентное изменение между средним значением датой диапазоном А по сравнению с диапазоном дат В.MySQL: Расчет процентного изменения от средних значений двух диапазонов

Например, сайт имеет 100 посетителей в течение диапазон дат A и 200 посетителей в диапазоне дат B, что дает увеличение на 100%.

Значения хранятся в одной таблице.

EDIT: значения посещения хранятся в одной таблице, URL-адреса хранятся во второй таблице, содержащей URL-адрес и идентификатор, который используется для объединения двух таблиц.

Мой запрос в его нынешнем виде является:

SELECT urls.url, DATE_FORMAT(test.timestamp, '%Y %m %d') AS timestamp, 
(SELECT test.visits 
FROM test, urls 
WHERE test.url_id = urls.id 
AND urls.url LIKE '%website%' 
AND test.location LIKE '%gb%' 
AND test.timestamp >='$startdate' 
AND test.timestamp <= '$enddate' 
) AS visitors1, 

(SELECT test.visits 
FROM test, urls 
WHERE test.url_id = urls.id 
AND urls.url LIKE '%website%' 
AND test.location LIKE '%gb%' 
AND test.timestamp >= DATE_SUB('$startdate', INTERVAL 
    DATEDIFF('$enddate','$startdate') DAY) 
AND test.timestamp <= DATE_SUB('$enddate', INTERVAL 
    DATEDIFF('$enddate','$startdate') DAY) 
) AS visitors2 
FROM test, urls 
WHERE test.url_id = urls.id 
AND urls.url LIKE '%website%' 
AND test.location LIKE '%gb%' 

EDIT: Исправлены ошибки в примере запроса

Я понимаю, что мне нужно добавить что-то вроде:

(visitors1 - visitors2)/visitors2 *100 

I 'точно не знаю, где

EDIT: Я строю приборную панель, нужный выход

URL | Количество посещений: 1 | Посещение диапазон 2 | Изменение в процентах

example.com | 100 | 200 | 100%

Извинения за ошибки в оригинальной публикации.

+0

Вы можете сделать это в mysql, но запрос будет довольно нечитаемым. Можете ли вы просто написать запрос (например, у вас есть), чтобы вернуть числа посещений в периоды A и B, а затем сделать (A-B)/B * 100 на результат после его возврата из mysql? – Agrajag

ответ

0

Просто оберните весь выбор внутри другого select, где вы можете получить доступ к столбцам результатов, используя их псевдонимы.

/*Outer select*/ 
SELECT 
    q.url, q.`timestamp`, q.visitors1, q.visitors2 
    , (q.visitors1 - q.visitors2)/(q.visitors2+0.00001) *100 AS percentage 
FROM (
/*Inner select*/ 
SELECT 
    url 
    , DATE_FORMAT(`timestamp`, '%Y %m %d') AS `timestamp`  
    , (SELECT visits 
    FROM test t 
/*note the use of explicit inner joins*/ 
    INNER JOIN urls u ON (t.url_id = u.id) 
     WHERE url LIKE '%website%' AND location LIKE '%gb%' 
/*instead of >= and <= you can use `between` it's shorter to type.*/ 
     AND timestamp BETWEEN '$startdate' AND '$enddate') AS visitors1 
    , (SELECT visits 
    FROM pagetest p 
    INNER JOIN urls u ON (p.url_id = u.id) 
     WHERE u.url LIKE '%icis%com%' 
     AND p.f_TTFB < p.f_render 
     AND location LIKE '%gb%' 
     AND `timestamp` BETWEEN 
      DATE_SUB('$startdate', INTERVAL DATEDIFF('$enddate','$startdate') DAY) 
     AND DATE_SUB('$enddate', INTERVAL DATEDIFF('$enddate','$startdate') DAY)) 
    AS visitors2 
FROM test 
/* looks like you've got a missing join in the above FROM clause */ 
WHERE url_id = id AND url LIKE '%website%' AND location LIKE '%gb%' 
/*Note that you need to supply each inner select with an alias*/ 
) AS q 
/*I've used "q" here*/ 

Заметка, пожалуйста, не используйте неявный синтаксис SQL'89 join, вместо этого используйте явные соединения SQL'92. Их гораздо легче отлаживать, потому что критерии соединения и критерии фильтра не смешиваются.

+0

Спасибо, Йохан. Сейчас я просто пытаюсь работать с вашим примером. Я не думаю, что помог себе, совершив ошибку в примере, который я дал (ошибка новобранец!) – tomsutton1984