2009-10-16 38 views
3

我正要问这个MySql列表并记住了SO。通过条件和精度从MySql获得一个百分比

运行MySql 5.0.85,我需要尽可能高效地进行一些查询。如果我能得到一些评论,我将不胜感激。

我以百万计收集数据,需要按一个字段分组的前50名,占前50名的百分比。

这是我想出来的...... 1)我有一种感觉,我可以更有效率,也许加入 2)我怎样才能百分之一百分之百的精度百分比,所以* 100.00 即:0.07变为7.00,得到SQL错误,如果我(百分比* 100)

SELECT user_agent_parsed, user_agent_original, COUNT(user_agent_parsed) AS thecount, 
    COUNT(*)/(SELECT COUNT(*) FROM agents) AS percentage 
FROM agents 
GROUP BY user_agent_parsed 
ORDER BY thecount DESC LIMIT 50; 

第二期,每日一次,我需要存档上述的结果。有关如何最好地做到这一点的任何建议?我可以安排cron,或者在我的情况下,启动,除非有人有更好的建议。

你觉得简单的'SELECT(上面)INTO foo'就足够了吗?

+0

第二期:不,你需要时间/档案中的日期? – lexu 2009-10-16 06:55:14

+0

对不起,是的,我有一个添加和更新的时间戳,只是没有在示例中显示它。我将携带一个唯一的ID以及 – user170579 2009-10-16 07:30:51

回答

8

第一期:

select count(*) from agents into @AgentCount; 

SELECT user_agent_parsed 
    , user_agent_original 
    , COUNT(user_agent_parsed) AS thecount 
    , COUNT(*)/(@AgentCount) AS percentage 
FROM agents 
GROUP BY user_agent_parsed 
ORDER BY thecount DESC LIMIT 50; 
+0

这是一个更高的表演者吗?还有两个问题,你甚至可能会放慢速度,因为你现在正在存储一个变量。毫秒肯定,但你能详细说明吗? – user170579 2009-10-16 07:29:50

+0

您的嵌套查询可能每个分组元素运行一次。矿运行一次。当然,这可能会被优化器捕获。 – lexu 2009-10-16 07:38:52

+0

啊,谢谢。我运行解释并看看。 – user170579 2009-10-16 08:00:47

0

我完全不理解你的问题,所以我只会先回答你如何得到百分比的问题。我会用你现在的查询。

SELECT user_agent_parsed, user_agent_original, COUNT(user_agent_parsed) AS thecount, 
    ((COUNT(*)/(SELECT COUNT(*) FROM agents)) * 100) AS percentage 
FROM agents 
GROUP BY user_agent_parsed 
ORDER BY thecount DESC LIMIT 50; 

为了让我帮你进一步,我想我需要你进一步阐述它;-)

+0

错位的paren,谢谢!第二个问题是,我将采取上述查询的结果,并希望及时保存结果状态。我正在将点击数存储到用户代理日志中,所以我可以发现Safari每天使用100次,IE使用一天65次(简化)。这当然每天都在变化,我想绘制一年内的增长/下降情况。我需要存储上述查询的结果,以获得长期统计信息。我正在考虑选择一个新表格,除非这是一个坏主意,并且有一个更优雅的表格, – user170579 2009-10-16 20:23:01