限制SQL中的行无法正常工作

限制SQL中的行无法正常工作,sql,oracle-sqldeveloper,Sql,Oracle Sqldeveloper,我想在我的选择中获得每个季节的前5行。我有四个赛季:SUM,SPR,AUT,WIN。 所以总共应该有20行。 我的选择如下所示: select * from ( select year, season, ROUND(avg(temperature),1) as avgTemp from temperature join month on temperature.MONTH = month.MONTH group by (season, year) order by

我想在我的选择中获得每个季节的前5行。我有四个赛季:SUM,SPR,AUT,WIN。 所以总共应该有20行。 我的选择如下所示:

select *
from (
    select year, season, ROUND(avg(temperature),1) as avgTemp
    from temperature join month on temperature.MONTH = month.MONTH
    group by (season, year)
    order by season, avgTemp asc
) where rownum <= 5;
但它应该是这样的:

 1996 SPR        9.6
  1991 SPR       10.3
  2006 SPR       10.3
  2004 SPR       10.6
  1995 SPR       10.6
  1996 SUM       18.9
  1993 SUM       19.1
  2007 SUM       19.5
  1998 SUM       19.5
  2000 SUM       19.6
  1993 AUT        8.7
  2007 AUT        9.9
  1998 AUT       10.0
  1996 AUT       10.0
  2008 AUT       10.5
  1996 WIN         .3
  1991 WIN        1.2
  2003 WIN        1.6
  2006 WIN        1.9
  2005 WIN        2.0
你知道如何改进选择还是有其他建议?提前谢谢

您需要使用row_number为每个分组获取5行:

select
    year,
    season,
    round(avg(temperature), 1) as avgTemp
from (
    select *,
        row_number() over(partition by season, year order by season, avgTemp) as rn
    from temperature t
    join month m
        on m.MONTH = t.MONTH
) a
where
    a.rn <= 1

您需要分三个步骤进行:

按季节和年份分组,计算平均温度 分配一个行号:它在每个季节重新开始,并根据平均温度按升序分配 仅选择行号介于1和5之间的行 SQL应该是未经测试的:

select year, season, avg_temp
from (
    select year, season, avg_temp,
        row_number() over(partition by season order by avg_temp) rn
    from (
        select year, season, ROUND(avg(temperature),1) as avg_temp
        from temperature
        join month on temperature.MONTH = month.MONTH
        group by season, year
    )
)
where rn <= 5;

重复帐户?已使用其他帐户登录。这个是我的这个查询称为Top N Per Group,有很多关于如何为SQL Server编写此查询的示例,这些示例使用CTE和行号,而其他示例则不依赖于您的SQL Server版本。我得到以下错误:FROM关键字not found where Expected谢谢Codo,这个有效!我想知道的最后一件事是如何在如上所示的SPR开始的季节之前订购?我已经添加了如何进行排序,我在最初的回答中忘记了这一点。由于按字母顺序排序会导致错误的顺序,所以您需要为季节分配数字。工作起来很有魅力!除此之外,您是否有任何建议如何按季节自上而下地对价值进行排序。所以这5行中最高的avgTemp是第一行,而不是最后一行?那么您想要每个季节的最高平均温度,并且希望它们在输出中自上而下显示?如果是这样,您需要在ORDER BY子句之后添加DESC:ORDER BY avg_temp in over子句和。。。结束,最末端的平均温度描述。
WITH cteAverageTempByYearBySeason AS (
    SELECT
       year
       ,season
       ,ROUND(AVG(temperature),1) as AvgTemp
    FROM
       Temperature t
       INNER JOIN Month m
       On t.MONTH = m.MONTH
    GROUP BY
       year
       ,season
)

, cteRowNumber AS (
    SELECT
       *
       ,ROW_NUMBER() OVER (PARTITION BY season ORDER BY AvgTemp ASC) as RowNumber
    FROM
       cteAverageTempByYearBySeason
)

SELECT *
FROM
    cteRowNumber
WHERE
    RowNumber <= 5
WITH cteAverageTempByYearBySeason AS (
    SELECT
       year
       ,season
       ,ROUND(AVG(temperature),1) as AvgTemp
       ,MAX(m.MONTH) as SeasonOrderBy
    FROM
       Temperature t
       INNER JOIN Month m
       On t.MONTH = m.MONTH
    GROUP BY
       year
       ,season
)

, cteRowNumber AS (
    SELECT
       *
       ,ROW_NUMBER() OVER (PARTITION BY season ORDER BY AvgTemp ASC) as RowNumber
    FROM
       cteAverageTempByYearBySeason
)

SELECT
    year
    ,season
    ,AVG
FROM
    cteRowNumber
WHERE
    RowNumber <= 5
ORDER BY
    SeasonOrderBy
    ,AvgTemp
    ,Year
select year, season, avg_temp
from (
    select year, season, avg_temp,
        row_number() over(partition by season order by avg_temp) rn
    from (
        select year, season, ROUND(avg(temperature),1) as avg_temp
        from temperature
        join month on temperature.MONTH = month.MONTH
        group by season, year
    )
)
where rn <= 5;
order by case season
        when 'SPR' then 1
        when 'SUM' then 2
        when 'AUT' then 3
        when 'WIN' then 4
    end, avg_temp;