代码之家  ›  专栏  ›  技术社区  ›  Shawn

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

sql
  •  0
  • Shawn  · 技术社区  · 7 年前

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

    enter image description here

    这是我目前的疑问:

    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年看到Abbeville,而不是2015年。我认为我需要进行分组或进行子查询以使结果平坦化。如果有人对我如何处理这件事有任何建议,我们将不胜感激。

    2 回复  |  直到 7 年前
        1
  •  2
  •   TheGameiswar    7 年前

    假设您使用的是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
    
        2
  •  1
  •   Aswani Madhavan    7 年前

    以下查询用于此目的。

    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