SQL查询从聚合平均值中查找最大行

SQL查询从聚合平均值中查找最大行,sql,mysql,aggregate,Sql,Mysql,Aggregate,假设我有以下表格: Sailor(sid, sname, age) Boat(bid, sid) 每艘船可以有许多水手,每个水手可以在许多船上服役。我想做的是找到一艘平均年龄最高的船 我可以通过以下子查询找到每艘船上水手的平均年龄: SELECT b.bid, AVG(s.age) AS avg_age FROM sailor s, boat b WHERE b.sid = s.sid GROUP BY b.bid 然而,我仍然停留在如何进一步从这个子查询中找到最大行的问题上 另外,我也

假设我有以下表格:

Sailor(sid, sname, age)  
Boat(bid, sid)
每艘船可以有许多水手,每个水手可以在许多船上服役。我想做的是找到一艘平均年龄最高的船

我可以通过以下子查询找到每艘船上水手的平均年龄:

SELECT b.bid, AVG(s.age) AS avg_age FROM sailor s, boat b
WHERE b.sid = s.sid
GROUP BY b.bid
然而,我仍然停留在如何进一步从这个子查询中找到最大行的问题上

另外,我也在寻找MySQL兼容的查询,如果这有什么不同的话

SELECT b.bid, AVG(s.age) AS avg_age 
FROM sailor s JOIN boat b USING (sid)
GROUP BY b.bid
ORDER BY AVG(s.age) DESC
LIMIT 1;
这将返回一行,由于排序的关系,它将包含最大平均年龄

SELECT t1.*
FROM
 (SELECT b.bid, AVG(s.age) AS avg_age FROM sailor s, boat b
  WHERE b.sid = s.sid
  GROUP BY b.bid) t1
LEFT OUTER JOIN
 (SELECT b.bid, AVG(s.age) AS avg_age FROM sailor s, boat b
  WHERE b.sid = s.sid
  GROUP BY b.bid) t2
 ON (t1.avg_age < t2.avg_age)
WHERE t2.avg_age IS NULL;

这将返回一行,由于排序原因,它将包含最大平均年龄。

在sql server中,它将是:

SELECT t1.*
FROM
 (SELECT b.bid, AVG(s.age) AS avg_age FROM sailor s, boat b
  WHERE b.sid = s.sid
  GROUP BY b.bid) t1
LEFT OUTER JOIN
 (SELECT b.bid, AVG(s.age) AS avg_age FROM sailor s, boat b
  WHERE b.sid = s.sid
  GROUP BY b.bid) t2
 ON (t1.avg_age < t2.avg_age)
WHERE t2.avg_age IS NULL;
  Select Top 1 Bid, Avg(age)
  From boat b Join sailor s 
     On s.sid = b.sid
  Group By Bid
  Order By Avg(Age) Desc
我不喜欢MySQL,但是有一个Linmit关键字限制返回的行数,如果你用它代替前1,它应该可以工作,不是吗?我不太清楚语法,但是

  Select  Bid, Avg(age)
  From boat b Join sailor s 
     On s.sid = b.sid
  Group By Bid
  Order By Avg(Age) Desc
   Limit 1 

在sql server中,它将是:

  Select Top 1 Bid, Avg(age)
  From boat b Join sailor s 
     On s.sid = b.sid
  Group By Bid
  Order By Avg(Age) Desc
我不喜欢MySQL,但是有一个Linmit关键字限制返回的行数,如果你用它代替前1,它应该可以工作,不是吗?我不太清楚语法,但是

  Select  Bid, Avg(age)
  From boat b Join sailor s 
     On s.sid = b.sid
  Group By Bid
  Order By Avg(Age) Desc
   Limit 1 

不幸的是,子查询上并没有可用的限制。如果您对子查询进行了双重查询,MySQL可能会无意中允许这样做。例如,选择。。。限制1我把问题的子查询部分理解为转移注意力。在我看来,他想要的是找到一艘水手平均年龄最高的船。是的,如果查询必须是子查询,那么没有嵌套@Bill Karwin建议的限制是个问题。我不明白,子查询在哪里???@Charles Bretana:这就是我的观点。我相信发问者认为答案需要一个子查询,而不是实际上需要一个子查询。不幸的是,子查询没有可用的限制。如果您将子查询加倍,MySQL可能是无意中允许的。例如,选择。。。限制1我把问题的子查询部分理解为转移注意力。在我看来,他想要的是找到一艘水手平均年龄最高的船。是的,如果查询必须是子查询,那么没有嵌套@Bill Karwin建议的限制是个问题。我不明白,子查询在哪里???@Charles Bretana:这就是我的观点。我相信提问者认为答案需要一个子查询,而不是实际上需要一个子查询。如果没有循环,那么首先使用dnagirl的LIMIT建议执行单独的查询可能比使用如此复杂的子查询更好。注意,使用自空联接时没有断开连接;如果两条船的平均船龄相同,将返回两排。是的,绝对难看。我通常不喜欢在子查询中进行分组。讨厌!这就是我一直在寻找的解决方案。尽管它并不优雅,@dnagirl的解决方案在实际情况下可能更可取,但我想了解SQL子查询在这种情况下是如何工作的。+1丑陋但正确。如果没有循环,那么首先使用dnagirl的LIMIT建议执行单独的查询可能比使用如此复杂的子查询更好。注意,使用自空联接时没有断开连接;如果两条船的平均船龄相同,将返回两排。是的,绝对难看。我通常不喜欢在子查询中进行分组。讨厌!这就是我一直在寻找的解决方案。尽管它并不优雅,@dnagirl的解决方案在实际情况下可能更可取,但我想了解在这种情况下SQL子查询是如何工作的。