Получение процента от MySql с группой по условию и точности

Я собирался спросить об этом список MySql и вспомнил о SO.

Запустив MySql 5.0.85, мне нужно быть максимально эффективным в нескольких запросах. Если бы можно было сделать небольшой обзор, был бы признателен.

Я собираю данные миллионами, и мне нужны 50 лучших, сгруппированных по одному полю, с процентом от того, сколько занимают эти 50 лучших.

Вот что я придумал... 1) У меня есть ощущение, что я могу быть более эффективным, возможно, с соединением 2) Как я могу получить процент с точностью до сотых, поэтому * 100,00, т.е.: .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 или, в моем случае, launchd, если у кого-то нет лучшего предложения.

Вы думаете, что простого 'SELECT (выше) INTO foo' будет достаточно?


person user170579    schedule 16.10.2009    source источник
comment
Второй вопрос: вам не нужно время/дата в архиве?   -  person lexu    schedule 16.10.2009
comment
Извините, да, у меня временная метка добавлена ​​и обновлена, просто не показал ее в примере. Я также собираюсь носить уникальный идентификатор   -  person user170579    schedule 16.10.2009


Ответы (2)


Первый выпуск:

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;
person lexu    schedule 16.10.2009
comment
Как это более высокая производительность? Еще два запроса, вы можете даже замедлить его, поскольку теперь вы буквально сохраняете переменную. миллисекунды, но можете ли вы уточнить? - person user170579; 16.10.2009
comment
Ваш вложенный запрос потенциально выполняется один раз для каждого сгруппированного элемента. Мой работает один раз. Конечно, это может быть поймано оптимизатором. - person lexu; 16.10.2009
comment
Нет необходимости в двойном выборе, оптимизатор MySql, по крайней мере, в 5.x позаботится об этом. - person user170579; 20.10.2009

Я не совсем понимаю ваш вопрос, поэтому сначала отвечу на ваш вопрос о том, как получить процент. И я воспользуюсь вашим нынешним запросом.

 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;

Чтобы я мог помочь вам в дальнейшем, я думаю, мне нужно, чтобы вы уточнили это подробнее ;-)

person junmats    schedule 16.10.2009
comment
Неуместный парен, спасибо!. Вторая проблема заключается в том, что я возьму результат вышеуказанного запроса и хочу сохранить это состояние результатов во времени. Я сохраняю обращения к журналу пользовательского агента, поэтому я могу обнаружить, что Safari — 100 использований в день, IE — 65 использований в день и т. д. (упрощенно). Это, конечно, меняется день ото дня, и я хочу наметить рост/снижение в течение года. Мне нужно сохранить результат вышеуказанного запроса для долгосрочной статистики. Я рассматриваю возможность выбора результата в новую таблицу, если только это не плохая идея и есть более элегантная, - person user170579; 17.10.2009