尝试使用 window 函数而不是此脚本

Trying to utilize a window function instead of this script

我正在努力改进我对手头这个主题的查询。我试图在我的组织中找到从 2020 年到 2021 年每个州的前 5 名和后 5 名增长率。 table 具有指定的列:orderid、orderdate、totaldue、state 等(这些可能是最重要的列)。这是我到目前为止创建的查询,虽然它有效,但我认为如果我能够改为实现 window 函数会更有效率。

SELECT state, SUM(TotalDue) as sum
into #temp2020
from table
where OrderDate like "2020%"
group by StateProvince
order by sum desc;

SELECT state, SUM(TotalDue) as sum
into #temp2021
from table
where OrderDate like "2021%"
group by StateProvince
order by sum desc;

--top 5 growth rates--
select #temp2020.state, ((#temp2021.sum-#temp2020.sum)/#temp2020.sum) as 'growthrate'
from #temp2020
join #temp2021 on #temp2021.state = #temp2020.state
order by growthrate desc limit 5

--bottom 5 growth rates--
select #temp2020.state, ((#temp2021.sum-#temp2020.sum)/#temp2020.sum) as 'growthrate'
from #temp2020
join #temp2021 on #temp2021.state = #temp2020.state
order by growthrate asc limit 5

drop table if exists #temp2020
drop table if exists #temp2021

您可以在此处使用 DENSE_RANK

WITH cte AS (
    SELECT state, SUM(TotalDue) AS sum,
           DENSE_RANK() OVER (ORDER BY SUM(TotalDue)) rnk_asc,
           DENSE_RANK() OVER (ORDER BY SUM(TotalDue) DESC) rnk_desc
    FROM yourTable
    WHERE YEAR(OrderDate) IN (2020, 2021)
    GROUP BY state
)

SELECT state, sum
FROM cte
WHERE rnk_asc <= 5 OR rnk_desc <= 5
ORDER BY state, sum;