如何在SQL Server

时间:2015-12-13 08:11:11

标签: sql sql-server

我在Microsoft SQL Server 2012中练习SQL(不是作业问题),并且有一个表Names。该表按年显示婴儿名称,列Sex(姓名性别),N(具有该名称的婴儿数),Yr(年)和Name (名称本身)。

我只需要使用一个SELECT语句来编写一个查询,该语句按年份返回最受欢迎的婴儿名称,包括性别,年份和所命名的婴儿数量。到目前为止,我有;

SELECT *
From Names
ORDER By N DESC;

以DESC顺序给出N的最高值,重复年份。我需要将它限制在每年的最高值,而我试图这样做的所有内容都会产生错误。你可以给我任何建议,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

脱离我的头脑,类似下面这样的内容通常会让你在(技术上)一个SELECT语句中执行此操作。该声明包括子SELECT,但我没有立即看到一个不会的替代品。

当有联合排名靠前的名字时,两个查询都应该带回所有联合顶级结果,因此可能没有一个答案。如果您只需要从这些结果中随机选择一个代表性行,请查看使用select top 1,或者添加order by以按字母顺序获取第一行。

无论性别如何,年份最受欢迎:

-- ONE PER YEAR:
SELECT n.Year, n.Name, n.Gender, n.Qty FROM Name n
 WHERE NOT EXISTS (
      SELECT 1 FROM Name n2
       WHERE n2.Year = n.Year
         AND n2.Qty > n.Qty
)

每个性别最受年度欢迎:

-- ONE PER GENDER PER YEAR:
SELECT n.Year, n.Name, n.Gender, n.Qty FROM Name n
 WHERE NOT EXISTS (
      SELECT 1 FROM Name n2
       WHERE n2.Year = n.Year
         AND n2.Gender = n.Gender
         AND n2.Qty > n.Qty
)

性能是,尽管SQL的冗长,但在使用这种模式时通常与替代方案相当(通常更好)。

还有其他方法,包括使用GROUP语句,但我个人认为这是一个更具可读性和标准的跨DBMS。

相关问题