如何根据一些标准选择组的一部分MS SQL
我有以下任务: 我们有以下MS SQL表: 国家/地区-具有ID和国家/地区名称, 山区中心-在国家和山区之间建立多对多关系 Mountains-具有ID和MountainName Peaks-有Id、PeakName和Mountain Id。所以我们有Mountain-Peak作为一对多关系 我们需要找到每个国家的最高峰,并显示它们及其名称。当一个国家没有山脉或山脉没有山峰时,我们也需要显示null。我们必须显示两个山峰,以防有两个海拔相同的最高山峰。结果一定是这样的 国家最高峰名称最高峰海拔山 阿富汗空 阿根廷阿肯卡瓜6962安第斯山脉 保加利亚穆萨拉2925里拉 如果不需要显示peaks的名称,我可以执行此任务。但我现在想不出来。当我按国家和山脉分组时,如何选择最高峰?我想用ROW_NUMBER()OVER(PARTITION BY…)但是它只会返回第一个最高峰值。因此,如果我们有两个相同高度的山峰,我们就不会把这两个山峰都拿走。以下是我目前的代码:如何根据一些标准选择组的一部分MS SQL,sql,sql-server,grouping,Sql,Sql Server,Grouping,我有以下任务: 我们有以下MS SQL表: 国家/地区-具有ID和国家/地区名称, 山区中心-在国家和山区之间建立多对多关系 Mountains-具有ID和MountainName Peaks-有Id、PeakName和Mountain Id。所以我们有Mountain-Peak作为一对多关系 我们需要找到每个国家的最高峰,并显示它们及其名称。当一个国家没有山脉或山脉没有山峰时,我们也需要显示null。我们必须显示两个山峰,以防有两个海拔相同的最高山峰。结果一定是这样的 国家最高峰名称最高峰海拔
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