2017-04-10 3 views
1

Schlechter Wortlaut, aber ich kann mir keine prägnante Beschreibung für mein Problem vorstellen.Erstellen einer Abfrage, um verschiedene Werte von einer einzelnen Spalte in eine neue Spalte zu subtrahieren

Ich habe eine Tabelle mit den folgenden Spalten:

year | month | basin_id | value 

ich die Werte für alle basin_ids von einem Jahr/Monat und subtrahieren, dass die entsprechenden Werte für alle basin_ids eines anderen Jahr/Monat nehmen müssen, und speichern Sie die resultierenden Werte so, dass sie immer noch ihren jeweiligen basin_ids zugeordnet sind. Diese

scheint, wie es eine ziemlich einfache Abfrage/Unterabfrage sein sollte, und ich kann den Unterschied in den Werten berechnen ganz gut mit:

SELECT (val1.value-val2.value) 
FROM value_table_1 as val1, 
    value_table_2 as val2 
WHERE val1.basin_id=val2.basin_id 

wo value_table_1 und value_table_2 sind temporäre Tabellen ich gemacht habe von allen Absonderungs Werte für Jahr1/Monat1 und Jahr2/Monat2, um meine Abfrage zu vereinfachen.

Mein Problem von hier ist, bekomme ich eine Spalte mit allen neuen Werten, aber nicht mit ihren zugehörigen Becken. Wie kann ich das erreichen? Ich schreibe dies innerhalb einer plpgsql gespeicherten Prozedur, wenn das hilft.

Say my Tabelle ist wie folgt:

year | month | basin_id | value 
-----+-------+----------+------- 
2017 | 04 | 123 | 10 
2017 | 04 | 456 | 6 
2017 | 05 | 123 | 12 
2017 | 05 | 456 | 4 

und ich bin die Eingänge gegeben:

year1 := 2017 
month1 := 04 
year2 := 2017 
month2 := 05 

Ich möchte die folgende Tabelle als Ergebnis erhalten:

basin_id | value 
----------+------ 
    123 | -2 
    456 | 2 
+1

Bearbeiten Sie Ihre Frage und geben Sie Beispieldaten und gewünschte Ergebnisse an. –

Antwort

1

Ich denke, du willst so etwas ..

CREATE TABLE foo 
AS 
    SELECT * 
    FROM (VALUES 
    (2010, 02, 5, 8), 
    (2013, 05, 5, 3) 
) AS t(year, month, basinid, value); 

CREATE TEMPORARY TABLE bar 
AS 
    SELECT basinid, 
    f1.year AS f1y, f1.month AS f1m, 
    f2.year AS f2y, f2.month AS f2m, 
    f1.value-f2.value AS value 
    FROM foo AS f1 
    INNER JOIN foo as f2 
    USING (basinid); 

basinid | f1y | f1m | f2y | f2m |  value 
---------+------+-----+------+-----+---------- 
     5 | 2010 | 2 | 2010 | 2 |  0 
     5 | 2010 | 2 | 2013 | 5 |  5 
     5 | 2013 | 5 | 2010 | 2 |  -5 
     5 | 2013 | 5 | 2013 | 5 |  0 
(4 rows) 

SELECT * 
FROM bar 
WHERE f1y = 2013 
    AND f1m = 5 
    AND f2y = 2010 
    AND f2m = 2; 
+0

Das sieht genau so aus, was ich brauche. Vielen Dank, ich werde die Antwort akzeptieren, wenn es mir erlaubt. –

+1

Sorry nur eine letzte Frage - wie kann ich der letzten Spalte von Werten einen Namen geben, damit ich sie abfragen kann? EDIT: vergiss, nur "als Wert" am Ende der "f1.value-f2.value" -Anweisung hinzugefügt –

Verwandte Themen