开窗函数可以和group by一起用吗
163浏览 · 2023-07-29 16:14:47
是的,开窗[函数](https://geek.csdn.net/educolumn/ba94496e6cfa8630df5d047358ad9719?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6NDQ0MDg2MiwiZXhwIjoxNzA3MzcxOTM4LCJpYXQiOjE3MDY3NjcxMzgsInVzZXJuYW1lIjoid2VpeGluXzY4NjQ1NjQ1In0.RrTYEnMNYPC7AQdoij4SBb0kKEgHoyvF-bZOG2eGQvc&spm=1055.2569.3001.10083)和 GROUP BY 子句可以一起使用。GROUP BY 子句将结果集按照指定的列进行分组,并对每个分组进行聚合计算,而开窗[函数](https://geek.csdn.net/educolumn/ba94496e6cfa8630df5d047358ad9719?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6NDQ0MDg2MiwiZXhwIjoxNzA3MzcxOTM4LCJpYXQiOjE3MDY3NjcxMzgsInVzZXJuYW1lIjoid2VpeGluXzY4NjQ1NjQ1In0.RrTYEnMNYPC7AQdoij4SBb0kKEgHoyvF-bZOG2eGQvc&spm=1055.2569.3001.10083)则可以在聚合计算的基础上对每个分组内的行进行进一步的计算。因此,使用开窗[函数](https://geek.csdn.net/educolumn/ba94496e6cfa8630df5d047358ad9719?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6NDQ0MDg2MiwiZXhwIjoxNzA3MzcxOTM4LCJpYXQiOjE3MDY3NjcxMzgsInVzZXJuYW1lIjoid2VpeGluXzY4NjQ1NjQ1In0.RrTYEnMNYPC7AQdoij4SBb0kKEgHoyvF-bZOG2eGQvc&spm=1055.2569.3001.10083)可以在 GROUP BY 子句的基础上实现更加灵活和复杂的聚合计算。
例如,以下 SQL 查询语句使用了 GROUP BY 子句和开窗[函数](https://geek.csdn.net/educolumn/ba94496e6cfa8630df5d047358ad9719?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6NDQ0MDg2MiwiZXhwIjoxNzA3MzcxOTM4LCJpYXQiOjE3MDY3NjcxMzgsInVzZXJuYW1lIjoid2VpeGluXzY4NjQ1NjQ1In0.RrTYEnMNYPC7AQdoij4SBb0kKEgHoyvF-bZOG2eGQvc&spm=1055.2569.3001.10083),对每个国家的销售额进行了排名:
SELECT
country,
SUM(sales) AS total_sales,
RANK() OVER (PARTITION BY country ORDER BY SUM(sales) DESC) AS sales_rank
FROM sales
GROUP BY country;
其中,`sales` 是销售数据表,`SUM(sales)` 计算了每个国家的总销售额,`RANK() OVER (PARTITION BY country ORDER BY SUM(sales) DESC)` 使用了开窗[函数](https://geek.csdn.net/educolumn/ba94496e6cfa8630df5d047358ad9719?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6NDQ0MDg2MiwiZXhwIjoxNzA3MzcxOTM4LCJpYXQiOjE3MDY3NjcxMzgsInVzZXJuYW1lIjoid2VpeGluXzY4NjQ1NjQ1In0.RrTYEnMNYPC7AQdoij4SBb0kKEgHoyvF-bZOG2eGQvc&spm=1055.2569.3001.10083),对每个国家的销售额进行降序排名,得到了每个国家的销售额排名。注意,这里的 GROUP BY 子句按照国家进行了分组聚合计算,而开窗函数则对每个分组内的行进行了排名计算。
相关问题
开窗函数和group by可以一起使用,可以在group by子句中使用开窗函数。例如,可以使用SUM()函数计算每个组的总和,并使用OVER()函数指定分组方式。例如,可以使用以下语法:
SELECT column1, column2, SUM(column3) OVE