基于日期 sql 聚合
Date based sql aggregation
我有一组列 F_no、F_date 和 F_weight。现在对于每个 F_date 和 F_no 我有总和(F_weight)。这很简单。
我现在想做的是,对于每个 F_date 和 F_no 我想在 F_weight 上聚合 (F_date-1) 和 (F_date-2).
table 结构看起来像:
| F_no | F_date |总和(F_date) | (F_date-1) |总和(F_date-1) | (F_date-2) |总和(F_date-2)|
谁能帮我解决这个问题?
谢谢
这会是你的意思吗?
(我同意,你可以更清楚地阐述你的问题,但有时我们的任务似乎也是,让神秘的问题变得有意义......)
WITH
input(f_no,f_date,f_weight) AS (
SELECT 42,'2017-01-01',30
UNION ALL SELECT 42,'2017-01-01',30
UNION ALL SELECT 42,'2017-01-02',25
UNION ALL SELECT 42,'2017-01-02',25
UNION ALL SELECT 42,'2017-01-03',20
UNION ALL SELECT 42,'2017-01-03',20
UNION ALL SELECT 42,'2017-01-04',15
UNION ALL SELECT 42,'2017-01-04',15
UNION ALL SELECT 42,'2017-01-05',10
UNION ALL SELECT 42,'2017-01-05',10
UNION ALL SELECT 42,'2017-01-06', 5
UNION ALL SELECT 42,'2017-01-06', 5
)
,
as_vertical AS (
SELECT DISTINCT
f_no
, f_date
, SUM(f_weight) OVER(PARTITION BY f_no,f_date) AS weight_sum
FROM input
)
-- now as pivot ...
SELECT
f_no
, f_date
, weight_sum
, LAG(f_date ,1) OVER(PARTITION BY f_no ORDER BY f_date) AS f_date_1
, LAG(weight_sum,1) OVER(PARTITION BY f_no ORDER BY f_date) AS weight_sum_1
, LAG(f_date ,2) OVER(PARTITION BY f_no ORDER BY f_date) AS f_date_2
, LAG(weight_sum,2) OVER(PARTITION BY f_no ORDER BY f_date) AS weight_sum_2
FROM as_vertical;
f_no|f_date |weight_sum|f_date_1 |weight_sum_1|f_date_2 |weight_sum_2
42|2017-01-01| 60|(null) |(null) |(null) |(null)
42|2017-01-02| 50|2017-01-01| 60|(null) |(null)
42|2017-01-03| 40|2017-01-02| 50|2017-01-01| 60
42|2017-01-04| 30|2017-01-03| 40|2017-01-02| 50
42|2017-01-05| 20|2017-01-04| 30|2017-01-03| 40
42|2017-01-06| 10|2017-01-05| 20|2017-01-04| 30
我应该补充:您可以在 Vertica 中执行此操作,因为它支持 OLAP 函数(LAG()
和 SUM() OVER()
)。 MySql没有,恐怕...
我有一组列 F_no、F_date 和 F_weight。现在对于每个 F_date 和 F_no 我有总和(F_weight)。这很简单。
我现在想做的是,对于每个 F_date 和 F_no 我想在 F_weight 上聚合 (F_date-1) 和 (F_date-2). table 结构看起来像:
| F_no | F_date |总和(F_date) | (F_date-1) |总和(F_date-1) | (F_date-2) |总和(F_date-2)|
谁能帮我解决这个问题? 谢谢
这会是你的意思吗? (我同意,你可以更清楚地阐述你的问题,但有时我们的任务似乎也是,让神秘的问题变得有意义......)
WITH
input(f_no,f_date,f_weight) AS (
SELECT 42,'2017-01-01',30
UNION ALL SELECT 42,'2017-01-01',30
UNION ALL SELECT 42,'2017-01-02',25
UNION ALL SELECT 42,'2017-01-02',25
UNION ALL SELECT 42,'2017-01-03',20
UNION ALL SELECT 42,'2017-01-03',20
UNION ALL SELECT 42,'2017-01-04',15
UNION ALL SELECT 42,'2017-01-04',15
UNION ALL SELECT 42,'2017-01-05',10
UNION ALL SELECT 42,'2017-01-05',10
UNION ALL SELECT 42,'2017-01-06', 5
UNION ALL SELECT 42,'2017-01-06', 5
)
,
as_vertical AS (
SELECT DISTINCT
f_no
, f_date
, SUM(f_weight) OVER(PARTITION BY f_no,f_date) AS weight_sum
FROM input
)
-- now as pivot ...
SELECT
f_no
, f_date
, weight_sum
, LAG(f_date ,1) OVER(PARTITION BY f_no ORDER BY f_date) AS f_date_1
, LAG(weight_sum,1) OVER(PARTITION BY f_no ORDER BY f_date) AS weight_sum_1
, LAG(f_date ,2) OVER(PARTITION BY f_no ORDER BY f_date) AS f_date_2
, LAG(weight_sum,2) OVER(PARTITION BY f_no ORDER BY f_date) AS weight_sum_2
FROM as_vertical;
f_no|f_date |weight_sum|f_date_1 |weight_sum_1|f_date_2 |weight_sum_2
42|2017-01-01| 60|(null) |(null) |(null) |(null)
42|2017-01-02| 50|2017-01-01| 60|(null) |(null)
42|2017-01-03| 40|2017-01-02| 50|2017-01-01| 60
42|2017-01-04| 30|2017-01-03| 40|2017-01-02| 50
42|2017-01-05| 20|2017-01-04| 30|2017-01-03| 40
42|2017-01-06| 10|2017-01-05| 20|2017-01-04| 30
我应该补充:您可以在 Vertica 中执行此操作,因为它支持 OLAP 函数(LAG()
和 SUM() OVER()
)。 MySql没有,恐怕...