限制SQL中的行无法正常工作
我想在我的选择中获得每个季节的前5行。我有四个赛季:SUM,SPR,AUT,WIN。 所以总共应该有20行。 我的选择如下所示:限制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
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;