我正在尝试从WHERE子句中使用AVG的多个表中选择数据。
SELECT company_metrics.*, companies.company_name, companies.permalink
FROM company_metrics LEFT JOIN companies
ON companies.company_id = company_metrics.company_id
WHERE MONTH(date) = '04' AND YEAR(date) = '2011'
HAVING (SELECT avg(company_unique_visitors)
FROM (SELECT company_metrics.company_unique_visitors
FROM company_metrics
ORDER BY company_metrics.date DESC LIMIT 3)
average ) >'2000'
ORDER BY date DESC
###Company Metrics#### Table
company_id company_unique_visitors date
----------- ----------------------- ----
604 2054 2011-04-01
604 3444 2011-03-01
604 2122 2011-02-01
604 2144 2011-01-01
604 2001 2010-12-01
602 2011 2011-04-01
602 11 2011-03-01
602 411 2011-02-01
602 611 2011-01-01
602 111 2010-12-01
修改 我想只有来自company_unique_visitors AVG'ed的3个最新号码 的 /修改
因此查询将选择company_id 604,但它不会选择company_id 602,因为602没有大于2000的AVG。
我需要帮助编写正确的查询来执行我所描述的操作。如果需要,我可以澄清一下。 谢谢你的帮助!
答案 0 :(得分:2)
您的查询存在一些问题。我并不完全清楚所有表格的结构,但我相信我会根据您发布的查询理解要点。发布的查询的第一个问题是,您不是在使用HAVING子句的查询中进行分组或使用任何聚合。您在其中一个子查询中使用聚合,但现在它的HAVING没有多大意义。
我相信在你做出平均值的总和之前你想通过company_id进行分组,所以我在外部查询中将其作为主要组。您还使用了太多嵌套查询来完成仅选择最近3次测量的看似简单的任务。我将该子查询移动到主连接中,以便仅以逻辑方式选择一次数据。
而且,没有进一步的仪式,这是固定的查询:
SELECT limited_metrics.*, companies.company_name, companies.permalink,
avg(limited_metrics.company_unique_visitors) AS avg_visitors
FROM
(SELECT *
FROM company_metrics
ORDER BY company_metrics.date DESC LIMIT 3) AS limited_metrics
LEFT JOIN companies
ON companies.company_id = limited_metrics.company_id
WHERE MONTH(limited_metrics.date) = '04' AND YEAR(limited_metrics.date) = '2011'
GROUP BY companies.company_id
HAVING avg_visitors > 2000
答案 1 :(得分:0)
好的基于Jared Harding的答案和帖子:Moving average - MySQL 我能够找出查询。
SELECT metrics.*,companies.company_name,companies.permalink
FROM (SELECT company_id,AVG(company_unique_visitors) AS met_avg
FROM company_metrics
WHERE `date` BETWEEN DATE_SUB(NOW(), INTERVAL 4 MONTH) AND NOW()
GROUP BY company_id HAVING met_avg>2000) AS metrics
LEFT JOIN companies ON companies.company_id=metrics.company_id
感谢Jared的所有帮助!