【问题标题】:how to get average of rows that have a certain relationship如何获得具有某种关系的行的平均值
【发布时间】:2014-04-24 00:19:25
【问题描述】:

我有一堆与县人口统计相关的数据存储在数据库中。我需要能够访问某个县的州内的平均数据。 例如,我需要能够获得 state_id 与 County_id 为 1 的县的 state_id 匹配的所有县的平均值。基本上,如果一个县在弗吉尼亚州,我需要弗吉尼亚州所有县的平均值.我在设置这个查询时遇到了麻烦,我希望你们能给我一些帮助。这是我写的,但它只从数据库返回一行,因为它将两个表的county_id链接在一起。

SELECT AVG(demographic_data.percent_white) as avg_percent_white 
FROM demographic_data,counties, states 
WHERE counties.county_id = demographic_data.county_id AND counties.state_id = states.state_id

这是我的基本数据库布局:

counties
------------------------
county_id | county_name

states
---------------------
state_id | state_name

demographic_data
-----------------------------------------
percent_white | percent_black | county_id

【问题讨论】:

    标签: mysql sql database average


    【解决方案1】:

    您的查询返回一行,因为有一个聚合且没有 GROUP BY。如果您想要一个州内所有县的平均值,我们希望只有一行。

    要获得一个州内所有县的“全州”平均值,以下是一种方法:

    SELECT AVG(d.percent_white) AS avg_percent_white
      FROM demographic_data d
      JOIN counties a
        ON a.county_id = d.county_id
      JOIN counties o
        ON o.state_id = a.state_id 
     WHERE o.county_id = 42
    

    请注意,无需加入state 表。您只需要具有匹配 state_id 的所有县。上面的查询使用了对counties 表的两个引用。别名为“a”的引用用于一个州内的所有县,别名为“o”的引用用于获取特定县的 state_id。

    如果您已经拥有 state_id,则不需要第二个参考:

    SELECT AVG(d.percent_white) AS avg_percent_white
      FROM demographic_data d
      JOIN counties a
        ON a.county_id = d.county_id
     WHERE a.state_id = 11
    

    跟进

    Q如果我想引入另一个表怎么办.. 我们称之为人口统计数据_2,它也通过县 ID 链接

    A 我假设demographic_data 表的每个county_id 有一行。如果第二个表也是如此,则进行简单的 JOIN 操作。

      JOIN demographic_data_2 c
        ON c.county_id = d.county_id 
    

    加入该表后,您可以在 SELECT 列表中添加适当的聚合表达式(例如 SUM、MIN、MAX、AVG)。

    问题点通常是“丢失”和“重复”数据...当第二个表中的每个county_id 没有一行,或者特定county_id 有不止一行时,导致行不包含在聚合中,或在聚合中被重复计算。


    我们注意到原始查询中返回的聚合是“平均值的平均值”。这是每个县的平均值。

    考虑:

    bucket  count_red  count_blue  count_total  percent_red
    ------  ---------  ----------  -----------  -----------
         1        480           4         1000           48
         2         60           1          200           30
    

    请注意,“平均值的平均值”与使用总计计算平均值之间存在差异。

    SELECT AVG(percent_red) AS avg_percent_red
         , SUM(count_red)/SUM(count_total) AS tot_percent_red
    
    avg_percent_red  tot_percent_red
    ---------------  ---------------
                 39               45
    

    这两个值都是有效的,我们只是不想曲解或歪曲这两个值。

    【讨论】:

    • 太好了..我还有最后一个问题..如果我想引入另一张桌子怎么办..我们称之为人口统计数据_2,它也通过县 ID 链接
    猜你喜欢
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2022-08-14
    • 2020-01-07
    • 1970-01-01
    • 2018-11-22
    • 2020-10-11
    • 1970-01-01
    相关资源
    最近更新 更多