SQL窗口函数的使用

明俊数据分析 2024-03-01 16:47:14

SQL窗口函数(Window Functions)提供了一种对数据集的一部分进行计算的方法,而这部分数据集是基于当前行的。这些函数可以在SELECT语句的SELECT list部分、ORDER BY子句中使用,非常适用于进行排名、分析、以及计算累计、移动平均、总和等操作。以下是几个常用的SQL窗口函数及其应用示例:

1. RANK()、DENSE_RANK() 和 ROW_NUMBER()RANK():为每一行分配一个排名,如果有并列,则会跳过下一个排名。DENSE_RANK():与RANK()类似,但并列排名之后不会跳过排名。ROW_NUMBER():为每一行分配一个唯一的数字,即使行之间的值相同也不会产生并列的情况。示例代码:SELECT name, score, RANK() OVER (ORDER BY score DESC) AS rank, DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank, ROW_NUMBER() OVER (ORDER BY score DESC) AS row_numberFROM scores;

这个示例中,我们对scores表中的数据根据score字段进行降序排列,并计算其排名、密集排名和行号。

2. LEAD() 和 LAG()LEAD():访问当前行之后的行的数据。LAG():访问当前行之前的行的数据。示例代码:SELECT date, sales, LAG(sales) OVER (ORDER BY date) AS previous_day_sales, LEAD(sales) OVER (ORDER BY date) AS next_day_salesFROM daily_sales;

这个示例展示了如何使用LAG()和LEAD()函数来获取前一天和后一天的销售额。

3. SUM()、AVG() 等聚合函数与窗口函数结合使用

窗口函数允许你在不分组数据的情况下,对数据集的特定部分进行聚合计算。

示例代码:SELECT name, department, salary, SUM(salary) OVER (PARTITION BY department) AS department_total_salary, AVG(salary) OVER (PARTITION BY department) AS department_avg_salaryFROM employees;

在这个示例中,SUM()和AVG()函数与OVER子句结合使用,按部门对薪水进行累加和平均计算,而不需要对数据进行分组。

窗口函数的使用极大地增强了SQL在数据分析方面的能力,使得对数据的复杂分析和计算变得更加简单和高效。

0 阅读:1

明俊数据分析

简介:感谢大家的关注