2017-06-09 11 views
1

私は、列F_no、F_dateおよびF_weightを持っています。今度はF_dateとF_noごとに合計(F_weight)があります。それはかなり簡単です。日付ベースのSQL集約

私が今やりたいことは、F_dateとF_noごとに、(F_date-1)と(F_date-2)のF_weightに集計したいということです。 テーブルの構造は次のようになります。

| F_no | F_date |合計(F_date)| (F_date-1)|合計(F_date-1)| (F_date-2)|合計(F_date-2)|

誰でもこの問題をお手伝いできますか? ありがとうございました

+0

https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-meを参照してください-to-be-be-a-very-simple-sql-query – Strawberry

答えて

1

これはどういう意味ですか? (私はあなたがより明確にあなたの質問を策定している可能性が、同意するが、時には不可解な質問の意味を理解するために、あまりにも、私たちの仕事のようです...)

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 

私は追加する必要があります:あなたはこれを行うことができますこれはOLAP関数(LAG()およびSUM() OVER())をサポートしているためです。 MySqlは、私は恐れています...