2017-06-09 5 views
1

Ich habe eine Reihe von Säulen F_no, F_date und F_weight. Jetzt Für jede F_date und F_no Ich habe Summe (F_weight). Das ist ziemlich einfach.Datum basierte SQL-Aggregation

Was ich jetzt tun möchte, ist für jedes F_date und F_no ich möchte auf F_weight für (F_date-1) und (F_date-2) aggregieren. Die Tabellenstruktur würde folgendermaßen aussehen:

| F_no | F_datum | Summe (F_date) | (F_date-1) | Summe (F_date-1) | (F_date-2) | Summe (F_date-2) |

Kann mir jemand bitte helfen Sie mit diesem Thema aus? Danke

+0

Siehe https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me -eine-sehr-einfache-SQL-Abfrage sein – Strawberry

Antwort

1

Könnte das sein, was Sie meinen? (Ich bin damit einverstanden, haben Sie Ihre Frage deutlicher formuliert könnte, aber manchmal scheint es unsere Aufgabe zu sein, auch Sinn für kryptischen Fragen zu machen ...)

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 

Ich sollte hinzufügen: Sie können dies tun, in Vertica, weil es unterstützt OLAP-Funktionen (LAG() und SUM() OVER()). MySql nicht der Fall, ich habe Angst ...