SQL 计算累计差可以使用窗口函数进行计算,可以使用SUM函数或LAG函数来实现。下面介绍两条实例。
实例一
我们有以下一张销售表,记录了每个商品的销售量和日期。我们需要对每个商品进行月度累计差值计算。
id | product | sales | date |
---|---|---|---|
1 | A | 50 | 2021-01-01 |
2 | A | 80 | 2021-02-01 |
3 | A | 60 | 2021-03-01 |
4 | A | 90 | 2021-04-01 |
5 | B | 100 | 2021-01-01 |
6 | B | 120 | 2021-02-01 |
7 | B | 150 | 2021-03-01 |
8 | B | 180 | 2021-04-01 |
SELECT
id,
product,
sales,
date,
SUM(sales) OVER (PARTITION BY product ORDER BY DATE) AS running_sales_total,
sales - LAG(sales) OVER (PARTITION BY product ORDER BY DATE) AS sales_diff
FROM
sales_table
ORDER BY
product, date;
解释:
首先按商品名称和日期对销售表进行分组排序,接着使用窗口函数 SUM()
计算每个商品的累计销售量,并使用 LAG()
计算当前行的销售量与前一行的销售量之差。 PARTITION BY
子句用于分组、ORDER BY
子句用于排序结果。
结果如下:
id | product | sales | date | running_sales_total | sales_diff |
---|---|---|---|---|---|
1 | A | 50 | 2021-01-01 | 50 | NULL |
2 | A | 80 | 2021-02-01 | 130 | 30 |
3 | A | 60 | 2021-03-01 | 190 | -20 |
4 | A | 90 | 2021-04-01 | 280 | 30 |
5 | B | 100 | 2021-01-01 | 100 | NULL |
6 | B | 120 | 2021-02-01 | 220 | 20 |
7 | B | 150 | 2021-03-01 | 370 | 30 |
8 | B | 180 | 2021-04-01 | 550 | 30 |
实例二
我们有以下一张订单表,记录了每个用户每月的订单总额。我们需要计算每个用户所有订单总额的年度累计差。
user_id | month | order_total |
---|---|---|
1 | 1 | 1000 |
1 | 2 | 2000 |
1 | 3 | 1500 |
1 | 4 | 3000 |
2 | 1 | 500 |
2 | 2 | 1000 |
2 | 3 | 700 |
2 | 4 | 1500 |
SELECT
user_id,
month,
order_total,
SUM(order_total) OVER (PARTITION BY user_id ORDER BY month) AS running_order_total,
order_total - LAG(order_total) OVER (PARTITION BY user_id ORDER BY month) AS order_diff,
SUM(order_total) OVER (PARTITION BY user_id ORDER BY month) - SUM(order_total) OVER (PARTITION BY user_id ORDER BY month) 12 months_total_diff
FROM
orders_table
ORDER BY
user_id, month;
解释:
SUM() OVER
函数用于计算每个用户的订单总额, LAG()
函数则计算当前月份订单总额与前一月份订单总额之差,最后求取每个用户的年度累计差。
结果如下:
user_id | month | order_total | running_order_total | order_diff | months_total_diff |
---|---|---|---|---|---|
1 | 1 | 1000 | 1000 | NULL | NULL |
1 | 2 | 2000 | 3000 | 1000 | 1000 |
1 | 3 | 1500 | 4500 | -500 | 2500 |
1 | 4 | 3000 | 7500 | 1500 | 5000 |
2 | 1 | 500 | 500 | NULL | NULL |
2 | 2 | 1000 | 1500 | 500 | 500 |
2 | 3 | 700 | 2200 | -300 | 700 |
2 | 4 | 1500 | 3700 | 800 | 3200 |
以上就是SQL 计算累计差的完整攻略,希望对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SQL 计算累计差 - Python技术站