MySQL 5.7.x实现sum() over(partition by v1,v2)
时间: 2023-12-14 22:38:46 浏览: 422
在MySQL 5.7.x中,可以使用子查询和变量来实现类似于`sum() over(partition by v1,v2)`的功能。
以下是实现的步骤:
1. 首先,创建一个变量`@sum`并初始化为0。
```sql
SET @sum := 0;
```
2. 然后,使用子查询计算每个分区的总和,并将结果存储在变量中。
```sql
SELECT v1, v2, @sum := @sum + amount as total
FROM your_table
ORDER BY v1, v2;
```
在上述查询中,`amount`是需要计算总和的列名,`your_table`是数据表名,`v1`和`v2`是需要分区的列名。
3. 最后,将查询结果按照分区列和总和列进行排序,以便让每个分区的总和排在前面。
```sql
SELECT v1, v2, total
FROM (
SELECT v1, v2, @sum := @sum + amount as total
FROM your_table
ORDER BY v1, v2
) t
ORDER BY v1, v2, total;
```
这样就可以实现类似于`sum() over(partition by v1,v2)`的功能了。
相关问题
MySQL 5.7.x实现sum() over(partition by)
MySQL 5.7.x中可以使用变量来模拟实现`sum() over(partition by)`的功能。
以下是一个示例查询:
```
SELECT id, name, score,
@sum := IF(@prev = name, @sum + score, score) AS total_score,
@prev := name
FROM scores
ORDER BY name;
```
这个查询会将`scores`表中的数据按照`name`字段进行分组,并且对每个分组内的`score`字段求和,同时在结果中显示每个记录的总分数。
查询中使用了两个变量`@sum`和`@prev`,它们的初始值均为NULL。在查询中,使用了IF函数判断当前记录的`name`字段是否与前一条记录相同,如果相同,则将当前记录的`score`字段加上之前的总分数;如果不同,则将当前记录的`score`字段作为新的总分数。最后,将当前记录的`name`字段赋值给`@prev`变量,以备下一条记录使用。
需要注意的是,该方法只适用于单个分组内的求和,如果需要对多个分组进行求和,则需要进行一些修改。
阅读全文