两列之间的平均比率

时间:2016-02-03 22:46:30

标签: sql

我一直在收集推文,并对它们运行一些查询。 在其中一个查询中,我试图找到所有用户的平均跟随者与朋友之比至少为2(即朋友的跟随者数量的两倍)。找到平均值很重要,因为我在不同的时间多次收集了一些用户的推文。他们的朋友或追随者可以改变,所以他们可以提出多种比率。

我可以在没有平均值的情况下执行此操作,从而导致某些用户的多个结果

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 :(得分:1)

您需要group byhaving条款:

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

我认为screenname是" user"的意思。不要在SELECT中放置无关列 - 这些列应该在GROUP BY或聚合函数的参数中。

答案 1 :(得分: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。)

可能你真正想要的是那些没有朋友但有粉丝或有朋友并且比例足够高的人。对于每个屏幕名称的单个比率,您可以在没有比率时显示空白,在有比率时显示数字。但是在这些情况下如何平均比率? - 并不总是有比例。

比率或平均值的平均值极不可能相关。例如,平均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

您必须确定您希望查询返回的内容。但它极不可能是平均比率。

相关问题