2016-02-03 3 views
1

Я собирал твиты и выполнял некоторые запросы на них. В одном из запросов я пытаюсь найти всех пользователей, у которых среднее отношение следопыта к другу составляет как минимум два (т. Е. В два раза больше последователей в качестве друзей). Найти среднее значение важно, потому что я собирал чириканье некоторых пользователей несколько раз в разное время. Их друзья или последователи могут измениться, поэтому они могут найти множество коэффициентов.Среднее соотношение между двумя столбцами

я могу сделать это без средних, в результате нескольких результатов для некоторых пользователей

SELECT screenname,followers,friends,usertweets, followers/friends AS FFRatio 
FROM tweets 
WHERE friends >0 AND followers/friends>2 

Когда я пытаюсь использовать AVG, я получаю ошибки, и никаких результатов.

SELECT screenname,followers,friends,usertweets, AVG(followers/friends) AS FFRatio 
FROM tweets 
WHERE friends >0 AND AVG(followers/friends)>2 

Не могли бы вы рассказать мне, что не так, пожалуйста?

+2

Я удалил посторонние теги базы данных.Добавьте обратно соответствующий тег для используемой базы данных. –

+0

@philipxy Я предположил, что деление на 0 вызовет проблемы – FProlog

+1

Примеры данных и желаемые результаты помогут объяснить проблему. –

ответ

1

Вам нужно group by и having положение о:

SELECT screenname, AVG(followers/friends) AS FFRatio 
FROM tweets 
WHERE friends > 0 
GROUP BY screenname 
HAVING AVG(followers/friends) > 2; 

я предполагаю screenname является то, что вы имеете в виду под "пользователем". Не помещайте посторонние столбцы в SELECT - столбцы должны либо находиться в GROUP BY, либо аргументы для функций агрегации.

+0

Да имя экрана - пользователь. Но я также хочу, чтобы другие столбцы в SELECT отображались. Нет ли способа сделать это? – FProlog

+0

Если у вас есть только одна строка на каждое «имя экрана», вы можете поместить их в один и тот же блок и добавить их в 'group by'. Или вы можете использовать это как подзапрос и присоединить его обратно к таблице твитов для дополнительных данных. –

+0

@ConsiderMe некоторые экраны имеют несколько строк, некоторые некоторые из них чирикают более одного раза. Должен ли я использовать подзапрос? Потому что я хочу показать все, что в SELECT моего вопроса. – FProlog

1

Ваш тест для> 0 не обязательно выполняется перед делением. Если у вас есть это в одном и том же состоянии, вы можете использовать CASE, который выполняет дела по порядку. Вы можете переместить коэффициент в HAVING, который оценивается после WHERE.

Среднее значение отношения к имени экрана, имя группы GROUP BY.

SELECT screenname, AVG(followers/friends) AS FFRatio 
FROM tweets 
WHERE friends > 0 
GROUP BY screenname 
HAVING FFRatio > 2 

(AVG представляет собой совокупность функций и должен появиться в HAVING или SELECT. Другие столбцы в GROUP BY может появиться в SELECT. Если столбец не однозначна на группу, то нет одного значения SELECT. но если столбцы являются однозначными для каждой группы, и вы хотите их выход, то вы можете добавить их в GROUP BY & SELECT.)

нО Возможно, что вы действительно хотите, это люди, у которых нет друзей, но есть последователи или иметь друзей, а также достаточно хорошее соотношение. Для одного отношения к имени экрана вы можете отображать пробел, когда нет отношения и числа, когда есть. Но как средние коэффициенты в этих случаях? - не всегда есть соотношение.

BUT Крайне маловероятно, что среднее значение отношения или среднего значения имеет значение. Например, усреднение 100/4 и 99/99 дает (25 + 1)/2 = 13. Но среднее значение по всем наблюдениям составляет 199/103. Точно так же в вашем случае вы можете иметь наблюдения с последователями, но без друзей, без отношения, но это следует учитывать.

Если вы хотите использовать понятие «недавнее», вы можете использовать AVG (последователей)/AVG (друзей), где значения взяты из некоторого стандартного интервала времени. Возможно, ваш вход - это активность для такого интервала или аппроксимация одного из них. (Вы все еще предполагая равномерное распределение наблюдений по времени.) Если это так:

SELECT screenname, AVG(followers) AS FoAvg, AVG(friends) AS FrAvg, 
    CASE WHEN FrAvg = 0 THEN '' 
    ELSE FoAvg/FrAvg END AS FFRatio 
FROM tweets 
GROUP BY screenname 
HAVING CASE WHEN FrAvg = 0 AND FoAvg > 0 THEN 1 
    WHEN FrAvg > 0 AND FoAvg/FrAvg > 2 THEN 1 
    ELSE 0 END 

Вы должны решить, что вы хотите, чтобы ваш запрос вернуться. Но это крайне маловероятно, чтобы быть средним коэффициентом.

Смежные вопросы