在SQL中通过筛选器仅选择最大值

在SQL中通过筛选器仅选择最大值,sql,Sql,假设我有一个只有3列的表:name、total和yeartotal表示在给定年份中拥有该姓名的总人数。它看起来像这样,但有更多的条目: name total year Mary 100 1955 Jenny 20 1955 Susy 50 1956 Sarah 33 1956 我想要一个表,它也有3列(name、total和year),只显示一系列年份中每年最流行的名称(例如,1885、1915

假设我有一个只有3列的表:
name
total
year
total
表示在给定年份中拥有该姓名的总人数。它看起来像这样,但有更多的条目:

name     total    year 

Mary     100       1955
Jenny     20       1955
Susy      50       1956
Sarah     33       1956
我想要一个表,它也有3列(
name
total
year
),只显示一系列年份中每年最流行的名称(例如,1885、1915、1945、1975和2005)

我试过这个:

CREATE OR REPLACE temporary view HistoricNames as 
SELECT firstName, year, max(total) as total
FROM SSANames
WHERE year = 1885 or year = 1915 OR year = 1945 or year = 1975 or year = 2005
group by firstName, year
ORDER by total 

但我每年都会收到很多参赛作品,不是最受欢迎的

您可以使用
行编号()


您没有提到您正在使用哪个数据库,但我假设它是一个具有窗口功能的现代数据库。你可以做:

select * 
from (
  select *,
    row_number() over(partition by year order by total desc) as rn
  from ssanames
  where year in (1885, 1915, 1945, 1975,2005)
) x
where rn = 1

已回答问题的用户的积分。您可以重写这些查询以使子查询过时:

SELECT TOP 1 WITH TIES firstName, year, total
FROM SSANames
WHERE year IN (1885, 1915, 1945, 1975, 2005)
ORDER BY ROW_NUMBER() OVER (PARTITION BY year ORDER BY total DESC)

这里的诀窍是
行数()
的工作原理与其他答案中的工作原理相同。通过使用orderby可以有效地将所有标有“一”(每年一行)的行放在第一位。然后是
TOP 1
您仅检索您所订购的第一个值,再次检索该值<代码>与关系最终不仅检索第一个数据库,而且检索所有数据库。

您使用的是哪种数据库管理系统?
SELECT TOP 1 WITH TIES firstName, year, total
FROM SSANames
WHERE year IN (1885, 1915, 1945, 1975, 2005)
ORDER BY ROW_NUMBER() OVER (PARTITION BY year ORDER BY total DESC)