什么是开窗函数,对OVER()举例,全网最佳解释

在SQL中,开窗函数(Window Function)允许您在一组相关的行上执行计算,这组行与当前行有关。这可以被视为一个“窗口”或“框架”,其中当前的行位于中心,而其他的行与它相关。使用开窗函数,您可以轻松完成滚动平均值、累积总和和其他类型的分析,而不需要自复杂的子查询或联接。

最关键的部分就是`OVER()`子句,它定义了窗口的界限和排序方式。

以下是一个简单的例子,用于解释开窗函数的概念:

假设您有以下的`sales`表格,列出了每个员工在不同日期的销售情况:

```
employee_id | sale_date  | sales
------------|------------|------
1           | 2023-08-01 | 100
1           | 2023-08-02 | 150
1           | 2023-08-03 | 200
2           | 2023-08-01 | 50
2           | 2023-08-02 | 75
2           | 2023-08-03 | 125
```

现在,您想为每个员工计算累积的销售情况。使用开窗函数,这可以轻松完成:

```sql
SELECT 
    employee_id,
    sale_date,
    sales,
    SUM(sales) OVER (PARTITION BY employee_id ORDER BY sale_date) AS cumulative_sales
FROM
    sales;
```

这将返回以下的结果:

```
employee_id | sale_date  | sales | cumulative_sales
------------|------------|-------|------------------
1           | 2023-08-01 | 100   | 100
1           | 2023-08-02 | 150   | 250 (100 + 150)
1           | 2023-08-03 | 200   | 450 (100 + 150 + 200)
2           | 2023-08-01 | 50    | 50
2           | 2023-08-02 | 75    | 125 (50 + 75)
2           | 2023-08-03 | 125   | 250 (50 + 75 + 125)
```

在上述SQL中,`SUM(sales) OVER (PARTITION BY employee_id ORDER BY sale_date)`表示我们对销售额进行求和,但这不是对整个表进行的。相反,我们将数据按`employee_id`进行划分,然后根据`sale_date`进行排序来创建一个“窗口”,然后在该“窗口”内进行求和。这就是为什么每一行都显示了到那一天为止的员工的累积销售额

你可能感兴趣的:(java)