将人们的年龄存储在一张桌子中是非常不寻常的,因为它每天都在变化。数据应带有出生日期。
这是一个聚合查询,但是您必须多次连接表。要获得祖父母,您需要在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