Sql按列的最大值选择不同的行

Sql按列的最大值选择不同的行,sql,Sql,我在尝试为每个城市名称选择一行时遇到问题。这是我得到的以下收藏: 这是我目前的疑问: select pl.PlaceId, pl.Name, pop.NumberOfPeople, pop.Year from dbo.Places pl inner join dbo.Populations pop on pop.PlaceId = pl.PlaceId where pop.NumberOfPeople >= 1000 and pop.Num

我在尝试为每个城市名称选择一行时遇到问题。这是我得到的以下收藏:

这是我目前的疑问:

select pl.PlaceId,
       pl.Name,
       pop.NumberOfPeople,
       pop.Year
from dbo.Places pl
inner join dbo.Populations pop
    on pop.PlaceId = pl.PlaceId
where pop.NumberOfPeople >= 1000
and pop.NumberOfPeople <= 99999

我试图让它只选择一个城市一次,但使用最近的日期。因此,在上图中,我只会看到2016年的阿贝维尔,而不是2015年。我认为我需要进行分组或子查询,以使结果平坦化。如果有人对我如何处理这个问题有任何建议,我们将不胜感激。

假设您使用的是SQLSERVER,那么您可以使用Rownumber

;with cte
as
(select pl.PlaceId,
       pl.Name,
       pop.NumberOfPeople,
       pop.Year,
row_number() over(partition by pl.Name order by year desc) as rownum
from dbo.Places pl
inner join dbo.Populations pop
    on pop.PlaceId = pl.PlaceId
where pop.NumberOfPeople >= 1000
and pop.NumberOfPeople <= 99999
)
select * from cte where rownum=1

假设您使用的是SQLSERVER,则可以使用Rownumber

;with cte
as
(select pl.PlaceId,
       pl.Name,
       pop.NumberOfPeople,
       pop.Year,
row_number() over(partition by pl.Name order by year desc) as rownum
from dbo.Places pl
inner join dbo.Populations pop
    on pop.PlaceId = pl.PlaceId
where pop.NumberOfPeople >= 1000
and pop.NumberOfPeople <= 99999
)
select * from cte where rownum=1

下面的查询用于此目的

CREATE TABLE #TEMP_TEST
(
PlaceId INT,
Name VARCHAR(50),
NumberOfPeople INT,
YEAR INT
)

INSERT INTO #TEMP_TEST 
SELECT 1,'Abbeville',2603,2016
UNION
SELECT 5,'Alabester',32948,2016
UNION
SELECT 9,'Aubum',63118,2016
UNION
SELECT 1,'Abbeville',2402,2015
UNION
SELECT 5,'Alabester',67902,2017



SELECT PlaceId, Name, NumberOfPeople, YEAR  FROM
 (
   SELECT ROW_NUMBER() OVER (PARTITION BY PlaceId ORDER BY YEAR DESC) RNO, 
          PlaceId, Name, NumberOfPeople, YEAR 
   FROM #TEMP_TEST
 )T
WHERE RNO = 1

DROP TABLE  #TEMP_TEST

下面的查询用于此目的

CREATE TABLE #TEMP_TEST
(
PlaceId INT,
Name VARCHAR(50),
NumberOfPeople INT,
YEAR INT
)

INSERT INTO #TEMP_TEST 
SELECT 1,'Abbeville',2603,2016
UNION
SELECT 5,'Alabester',32948,2016
UNION
SELECT 9,'Aubum',63118,2016
UNION
SELECT 1,'Abbeville',2402,2015
UNION
SELECT 5,'Alabester',67902,2017



SELECT PlaceId, Name, NumberOfPeople, YEAR  FROM
 (
   SELECT ROW_NUMBER() OVER (PARTITION BY PlaceId ORDER BY YEAR DESC) RNO, 
          PlaceId, Name, NumberOfPeople, YEAR 
   FROM #TEMP_TEST
 )T
WHERE RNO = 1

DROP TABLE  #TEMP_TEST