【问题标题】:Average ratio between two columns两列之间的平均比率
【发布时间】:2016-02-03 22:46:29
【问题描述】:

我一直在收集推文,并对它们进行一些查询。 在其中一个查询中,我试图找到平均追随者与朋友比率至少为 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

你能告诉我有什么问题吗?

【问题讨论】:

  • 我删除了无关的数据库标签。请为您正在使用的数据库添加适当的标签。
  • @philipxy 我认为除以 0 会导致问题
  • 样本数据和预期结果有助于解释问题。
  • @philipxy 你的正确答案?我只能看到这个问题的另一个答案
  • 请更清楚地解释你想要什么。请给出示例输入和所需的输出。您是否希望每个输入行都有一个输出行,并添加该屏幕名称的所有行的平均比率?您是否还想要输入推文值的平均数量,即输入推文是自上次观察/行以来的推文数量?还是推文是累积的?还是推文只是输入行的数量,因为您在推文中添加了行?同样,追随者和朋友是新的还是累积的?如果您不告诉我们您的输入和期望的输出,那么我们就无法知道。

标签: sql


【解决方案1】:

您需要一个group byhaving 子句:

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

我认为screenname 是您所说的“用户”。不要在 SELECT 中放置无关的列——这些列应该在 GROUP BY 中或聚合函数的参数中。

【讨论】:

  • 是的用户名是用户。但我也希望显示 SELECT 中的其他列。没有办法吗?
  • 如果每个screenname 只有一行,您可以将它们放在同一个块中,然后将它们添加到group by。或者您可以将其用作子查询并将其连接回tweets 表以获取额外数据
  • @ConsiderMe 一些网名有多行,因为其中一些人不止一次发推文。我必须使用子查询吗?因为我想显示问题的 SELECT 中的所有内容。
  • 您可能会滥用一点,并为您想要包含的每一列使用MAX() 以获得您只需要一次的值,但这取决于您的数据。具有 > 1 行的一位用户的示例数据会很有帮助。
【解决方案2】:

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

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

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(followers)/AVG(friends),其中的值来自某个标准时间间隔。也许您的输入是这样一个间隔的活动或一个近似值。 (您仍然会假设观察值随时间均匀分布。)如果是这样:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多