Sql 两列之间的平均比率

Sql 两列之间的平均比率,sql,Sql,我一直在收集推文,并对它们进行一些查询。 在其中一个查询中,我试图找到平均追随者与朋友比率至少为2的所有用户,即追随者数量是朋友数量的两倍。找到平均值很重要,因为我在不同的时间多次收集了一些用户的tweet。他们的朋友或追随者可以改变,因此他们可以提出多个比率 我可以在没有平均值的情况下完成,从而为一些用户带来多个结果 SELECT screenname,followers,friends,usertweets, followers/friends AS FFRatio FROM tweets

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

我可以在没有平均值的情况下完成,从而为一些用户带来多个结果

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
你能告诉我出了什么问题吗?

你需要一个group by和HAVE子句:


我想你所说的用户就是屏幕名。不要在SELECT中放置无关的列-这些列应该位于GROUP BY或聚合函数的参数中。

在除法之前不一定要执行对>0的测试。如果这些条件相同,则可以使用CASE,它按顺序执行CASE。您可以将比率移动到HAVING,在WHERE之后对其进行评估

要平均每个屏幕名称的比率,请按屏幕名称分组

SELECT screenname, AVG(followers/friends) AS FFRatio 
FROM tweets
WHERE friends > 0
GROUP BY screenname
HAVING FFRatio > 2
AVG是一个聚合函数,必须出现在HAVING或SELECT中。“分组依据”中的其他列可以显示在“选择”对话框中。如果列不是每个组的单值列,则没有一个值可供选择。但是,如果列是每个组的单值列,并且希望输出这些列,则可以通过&SELECT将它们添加到组中

但也许你真正想要的是那些没有朋友但有追随者或朋友的人,而且他们的比例足够好。对于每个屏幕名的单个比率,当没有比率时,可以显示空白,当有比率时,可以显示数字。但在这些情况下,如何平均比率?-并不总是有比率

但比率或平均数的平均值极不可能是相关的。平均100/4和99/99得到25+1/2=13。但所有观测的平均值为199/103。同样地,在你的情况下,你可能会观察到追随者,但没有朋友,因此没有比率,但这应该被考虑在内

如果您想了解最近的比率,那么可以使用AVGfollowers/AVGfriends,其中的值来自某个标准时间间隔。也许你的输入是这样一个时间间隔的活动或一个时间间隔的近似值。你仍然会假定观测值随时间的均匀分布。如果是:

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

您必须决定希望查询返回什么。但这不太可能是平均比率。

我删除了无关的数据库标签。请为您正在使用的数据库重新添加适当的标记。@philipxy我假设除以0会导致问题示例数据和期望的结果将有助于解释问题。@philipxy您的正确答案是什么?我只能看到这个问题的另一个答案,请更清楚地解释你想要什么。请给出示例输入和所需输出。是否希望为每个输入行添加一个输出行,并为该屏幕名称添加所有行的平均比率?您是否还需要输入tweets值的平均数,即输入tweets是自上次观察/行以来的tweets数?或者推特是累积的?或者tweets仅仅是输入行的数量,因为您在tweet上添加了行?同样,追随者和朋友是新的还是累积的?如果您不告诉我们您的输入和期望的输出,那么我们无法知道。是的,屏幕名是user。但我还希望显示SELECT中的其他列。没有办法做到这一点吗?如果每个屏幕名只有一行,可以将它们放在同一块中,然后按分组方式添加。或者您可以将其用作子查询,并将其连接回tweets表以获得额外的数据data@ConsiderMe有些屏幕名称有多行,因为有些屏幕名称在推特上不止一次。我必须使用子查询吗?因为我想显示我的问题选择中的所有内容。你可能会滥用一点,对你想包含的每一列使用MAX,以获得你只需要一次的值,但这取决于你的数据。对于一个具有>1行的用户,示例数据将非常有用。
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