在SQL中通过筛选器仅选择最大值
假设我有一个只有3列的表:在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
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)