我在Microsoft SQL Server 2012中练习SQL(不是作业问题),并且有一个表Names
。该表按年显示婴儿名称,列Sex
(姓名性别),N
(具有该名称的婴儿数),Yr
(年)和Name
(名称本身)。
我只需要使用一个SELECT
语句来编写一个查询,该语句按年份返回最受欢迎的婴儿名称,包括性别,年份和所命名的婴儿数量。到目前为止,我有;
SELECT *
From Names
ORDER By N DESC;
以DESC顺序给出N的最高值,重复年份。我需要将它限制在每年的最高值,而我试图这样做的所有内容都会产生错误。你可以给我任何建议,我将不胜感激。
答案 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。