SQL语句:平均值

我的问题:成为第一位祖父的平均年龄是多少?该解决方案应以average_age的形式给出。一个人成为爷爷的那一天就是他的第一个孙子出生的地方。

关系:

human (name,gender,age) 
parent (ParentName,ChildName) -> is subset of human(name).

表格:

SQL语句:平均值

SQL语句:平均值

我确实知道爷爷是有父母名字的人,有孩子名字的孩子,也是有孩子名字的孩子(孙子)的父母(父亲)。现在的问题是,如何获得成为爷爷的平均年龄。

到目前为止,我得到的是:

SELECT AVG(age) as average_age
FROM human h JOIN
     parent p
     ON h.name = p.parentname
WHERE h.gender = 'm' AND p.parentname = p.childname AND h.name = p.parentname

预期结果:

average_age : 52
zijire1 回答:SQL语句:平均值

将人们的年龄存储在一张桌子中是非常不寻常的,因为它每天都在变化。数据应带有出生日期。

这是一个聚合查询,但是您必须多次连接表。要获得祖父母,您需要在parents表上进行联接。然后,您需要引入humans进行过滤:

select avg(min_age * 1.0)
from (select min(h_grandparent.age - h.grandchild.age) as min_age
      from parent p join  -- p.parentname is the grandparent
           parent pchild
           on p.childname = pchild.parentname join
           human h_grandparent
           on p.parentname = h_grandparent.name join
           human h_grandchild
           on pchild.childname = h_grandchild.name
      where h_grandparent.gender = 'm'
      group by h_grandparent.name
     ) a
,

我将使用count条件来解决此问题,该条件会过滤具有孙子孙女的人类:

exists

select avg(age) avg_age_of_grandpas from human h where gender = 'm' and exists ( select 1 from parent p1 inner join parent p2 on p2.parentName = p1.childName where p1.parentName = h.name ) 条件可确保该人至少有一个孩子和一个大孩子。外部查询计算此类人员的平均值。考虑到表结构中可用的信息,在我看来这是最合乎逻辑的方法。与exists不同,使用join可以避免在一个人的后代多于一行时重复记录(并且平均得出错误的结果)。


如果您想要祖父母在其第一个孙子女出生之日的年龄,那就有点复杂了。这应该使您接近预期的结果:

exists
,

您可以再添加2个join,然后减去最大孙子的年龄:

SELECT AVG(p_age) average_age
FROM
(
    SELECT  h.name,h.age-MAX(h2.age) as p_age
    FROM parent p1 
        LEFT JOIN parent p2 ON P1.childname = P2.parentname
        INNER JOIN human h ON P1.parentname = h.name
        INNER JOIN human h2 ON P2.ChildName = h2.name
    WHERE h.gender = 'm' AND p2.childname IS NOT NULL
    GROUP BY h.name,h.age
)pAges

请注意,该名称不适合执行此任务。

本文链接:https://www.f2er.com/3153197.html

大家都在问