1

我今天做了一个测试,有两个问题我无法弄清楚。我忘了第二个,但这里是第一个:

你有一个关于啤酒的数据库。三个表,只有 2 个与问题相关。这些是:

品种:

  • 品种ID
  • 品种名称

啤酒:

  • beer_id
  • 啤酒名称
  • 品种ID
  • 啤酒酒精

beer_alcohol 是双精度数,代表酒精百分比。

共有38个品种的啤酒和1215个单独的啤酒条目。

问题是:显示所有单独的啤酒品种,每个品种的最高酒精百分比以及具有此百分比的啤酒的名称。

乍一看,这是对variety_id 的“内部连接”,对酒精的“max()”和对variety_id/variety_name 的“group by”。

问题是,这不会显示其品种中酒精含量最高的啤酒的名称。它将按字母顺序显示其品种中的第一个啤酒。

而且我对此感到头疼,但我无法开始想象如果没有功能如何做到这一点。有人可以启发我吗?

4

3 回答 3

0

再做一次加入,加入varietyid和%。在外面这样做会得到正确的信息。

如果有相同百分比的啤酒,这将返回 2 个结果

于 2013-10-23T18:59:49.767 回答
0

您也可以子选择,例如

select variety_id, variety_name, beer_name, abv
FROM varieties
JOIN (
  select beer_id, beer_name, variety_id, MAX(beer_alcohol) as abv
  FROM beers
  GROUP BY variety_id
) booziest ON booziest.variety_id = varieties.variety_id
于 2013-10-23T19:01:19.790 回答
0

I usually like to have sample data and sample output but let's blindly answer the question.

This is a greatest-n-per-group question (with n = 1). You can solve this with a derived table with a group by or, my personal favourite, the left join:

SELECT v.variety_id, v.variety_name, b1.* FROM beers b1
LEFT JOIN beers b2
  ON b1.variety_id = b2.variety_id AND b1.beer_alcohol < b2.beer_alcohol
WHERE b2.beer_alcohol IS NULL
JOIN varieties v ON b1.variety_id = v.variety_id
于 2013-10-23T19:03:44.843 回答