如何根据一些标准选择组的一部分MS SQL

如何根据一些标准选择组的一部分MS SQL,sql,sql-server,grouping,Sql,Sql Server,Grouping,我有以下任务: 我们有以下MS SQL表: 国家/地区-具有ID和国家/地区名称, 山区中心-在国家和山区之间建立多对多关系 Mountains-具有ID和MountainName Peaks-有Id、PeakName和Mountain Id。所以我们有Mountain-Peak作为一对多关系 我们需要找到每个国家的最高峰,并显示它们及其名称。当一个国家没有山脉或山脉没有山峰时,我们也需要显示null。我们必须显示两个山峰,以防有两个海拔相同的最高山峰。结果一定是这样的 国家最高峰名称最高峰海拔

我有以下任务: 我们有以下MS SQL表: 国家/地区-具有ID和国家/地区名称, 山区中心-在国家和山区之间建立多对多关系 Mountains-具有ID和MountainName Peaks-有Id、PeakName和Mountain Id。所以我们有Mountain-Peak作为一对多关系

我们需要找到每个国家的最高峰,并显示它们及其名称。当一个国家没有山脉或山脉没有山峰时,我们也需要显示null。我们必须显示两个山峰,以防有两个海拔相同的最高山峰。结果一定是这样的

国家最高峰名称最高峰海拔山 阿富汗空 阿根廷阿肯卡瓜6962安第斯山脉 保加利亚穆萨拉2925里拉

如果不需要显示peaks的名称,我可以执行此任务。但我现在想不出来。当我按国家和山脉分组时,如何选择最高峰?我想用ROW_NUMBER()OVER(PARTITION BY…)但是它只会返回第一个最高峰值。因此,如果我们有两个相同高度的山峰,我们就不会把这两个山峰都拿走。以下是我目前的代码:

SELECT c.CountryName, p.PeakName, MAX(p.Elevation) AS [HighestPeakElevation], m.MountainRange AS [Mountain]
FROM Countries c 
LEFT OUTER JOIN MountainsCountries mc ON c.CountryCode = mc.CountryCode
LEFT OUTER JOIN Mountains m ON m.Id = mc.MountainId
LEFT OUTER JOIN Peaks p ON p.MountainId = m.Id
GROUP BY CountryName, MountainRange
??????????
HAVING p.Elevation = MAX(p.Elevation) ???
谢谢你的帮助

SELECT c.CountryName, p.PeakName, p.Elevation AS [HighestPeakElevation], m.MountainRange AS [Mountain]
FROM Countries c 
LEFT OUTER JOIN MountainsCountries mc ON c.CountryCode = mc.CountryCode
LEFT OUTER JOIN Mountains m ON m.Id = mc.MountainId
LEFT OUTER JOIN Peaks p ON p.MountainId = m.Id 
HAVING p.Elevation = MAX(p.Elevation) OVER (PARTITION BY c.CountryName, m.MountainRange)


如果您只想将
ROW\u NUMBER()
与领带搭配,请尝试使用或
RANK()
。如果您只想将
ROW\u NUMBER()
与领带搭配,请尝试使用或
RANK()
SELECT CountryName, PeakName, HighestPeakElevation, Mountain FROM (SELECT c.CountryName AS CountryName, p.PeakName AS PeakName, p.Elevation AS PeakElevation, MAX (p.Elevation) OVER (PARTITION BY c.CountryName, m.MountainRange) AS [HighestPeakElevation], m.MountainRange AS [Mountain]
FROM Countries c 
LEFT OUTER JOIN MountainsCountries mc ON c.CountryCode = mc.CountryCode
LEFT OUTER JOIN Mountains m ON m.Id = mc.MountainId
LEFT OUTER JOIN Peaks p ON p.MountainId = m.Id) AS t WHERE PeakElevation = HighestPeakElevation