【问题标题】:MySQL : Calculating percentage change from average values of two rangesMySQL:从两个范围的平均值计算百分比变化
【发布时间】:2012-03-15 13:50:42
【问题描述】:

我正在尝试计算日期范围 A 的平均值与日期范围 B 之间的百分比变化。

例如,网站在日期范围 A 有 100 名访问者,在日期范围 B 有 200 名访问者,增加了 100%。

这些值存储在一个表中。

编辑:访问值存储在一个表中,URL 存储在第二个表中,其中包含 URL 和用于连接两个表的 id。

我的查询是:

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%'

编辑:更正示例查询中的错误

我知道我需要添加如下内容:

(visitors1 - visitors2) / visitors2 *100

我只是不确定在哪里

编辑:我正在构建一个仪表板,所需的输出是

网址 |访问范围 1 |访问范围 2 |百分比变化

example.com | 100 | 200 | 100%

对原始发布中的错误深表歉意。

【问题讨论】:

  • 您可以在 mysql 中执行此操作,但查询将相当不可读。你能像你一样写查询来返回A和B期间的访问次数,然后在从mysql返回结果后对结果执行(A-B)/B * 100?

标签: mysql


【解决方案1】:

只需将整个选择包装在另一个 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 连接语法,而是使用显式 SQL'92 连接。 它们更容易调试,因为连接条件和过滤条件没有混合在一起。

【讨论】:

  • 谢谢 Johan - 我现在只是在尝试使用您的示例。我认为我在给出的示例中犯了错误并没有帮助自己(新手错误!)
猜你喜欢
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
相关资源
最近更新 更多