【问题标题】:Maximum price in each group每组最高价
【发布时间】:2020-01-12 00:21:29
【问题描述】:

我有两张桌子 - BrandAuto

Brand 包含有关汽车品牌的信息。以下是列:

BrandId
BrandName
BrandCountry

Auto 包含有关特定型号的信息。列:

AutoId
AutoModel
BrandId
Price

Brand.BrandId = Auto.BrandId.

我的任务是展示每个品牌的最高价格的汽车模型。

这是我用来在没有汽车模型的情况下显示品牌和最高价格的查询(并且有效):

SELECT Brand.BrandName, MAX(Price)
FROM Brand 
INNER JOIN Auto ON Brand.BrandId = Auto.BrandId
GROUP BY Brand.BrandName

问题是它没有显示模型,我还需要显示模型名称。我尝试将其附加到这样的选择查询中:

SELECT Brand.BrandName, Auto.AutoModel, MAX(Price)
FROM Brand 
INNER JOIN Auto ON Brand.BrandId = Auto.BrandId
GROUP BY Brand.BrandName

我得到了错误

选择列表中的“Auto.AutoModel”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

我怎样才能做到这一点?

请帮助使用正确的 SQL Server 语法来解决问题。

【问题讨论】:

  • 错误在这里告诉你问题。您不了解错误怎么办,我们可以详细说明。
  • 您必须将所有列(不在聚合函数中)添加到 group by 子句。例如。 SELECT Brand.BrandName, Auto.AutoModel, MAX(Price) FROM Brand INNER JOIN Auto ON Brand.BrandId = Auto.BrandId GROUP BY Brand.BrandName, Auto.AutoModel
  • 这也是您在last question 中遇到的错误。你应该花时间去理解你的答案;否则你什么也学不到。
  • ljcordero,如果我将 Automodel 放入 Group By,结果将显示包含所有汽车的整个列表,我只需要那些具有最高价格的汽车。不过谢谢你的回答。

标签: sql sql-server


【解决方案1】:

Auto表使用ROW_NUMBER()窗口函数,得到每个BrandId的最高价格,然后加入Brand

SELECT b.BrandName, a.AutoModel, a.Price
FROM Brand AS b INNER JOIN (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY BrandId ORDER BY Price DESC) rn
  FROM Auto
) AS a
ON b.BrandId = a.BrandId
WHERE a.rn = 1

【讨论】:

    猜你喜欢
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 2016-06-28
    相关资源
    最近更新 更多