2017-09-19 5 views
1

Ich habe zwei SQL-Abfragen, die die durchschnittliche Temperatur eines Länder-Staaten und für das Land insgesamt zu erhalten, für jedes Jahr:SQL - Unterschied zwischen zwei Abfragen

SELECT strftime('%Y', date) as valYear, AVG(averageTemperature) 
FROM state 
WHERE country = 'Africa' 
GROUP BY valYear 

SELECT strftime('%Y', date) as valYear, AVG(averageTemperature) 
FROM country 
WHERE country = 'Africa' 
GROUP BY valYear 

Was ich will ist zu tun, um die Unterschiede zwischen berechnen der Staat und national für jedes Jahr. So zum Beispiel:

Nationale Daten

Year AverageTemp 
----------------- 
1954 17.5 
1955 18 

und Landesdaten:

Year AverageTemp 
----------------- 
1954 15.5 
1955 15 

ergäbe:

Difference

 Year Diff 
    ----------- 
    1954 2 
    1955 3 

Ich habe versucht, so etwas zu tun, aber es ergibt nicht die richtige Antwort.

SELECT 
    s.date, (c.averageTemperature - s.averageTemperature) AS Difference 
FROM 
    state s 
INNER JOIN 
    country c ON s.date = c.date 
WHERE 
    s.country = 'Africa' AND c.country = 'Africa' 

Antwort

3

Ein Ansatz, die hier arbeiten könnte wäre Ihre beiden Abfragen in Unterabfragen zu setzen und sie auf das Jahr beitreten:

SELECT 
    t1.valYear, 
    t1.avgTemp - t2.avgTemp AS Diff 
FROM 
(
    SELECT 
     strftime('%Y', date) AS valYear, 
     AVG(averageTemperature) AS avgTemp 
    FROM country 
    WHERE country = 'Africa' 
    GROUP BY valYear 
) t1 
INNER JOIN 
(
    SELECT 
     strftime('%Y', date) AS valYear, 
     AVG(averageTemperature) AS avgTemp 
    FROM state 
    WHERE country = 'Africa' 
    GROUP BY valYear 
) t2 
    ON t1.valYear = t2.valYear 

Die obige Abfrage hat ein bisschen wie ein Hack, um es zu fühlen. Um den Fall eines Jahres abzudecken, das in einer Tabelle erscheint, aber nicht in der anderen, müssten wir entweder auf eine vollständige äußere Verknüpfung oder eine hässliche Vereinigungsfrage zurückgreifen. Und in jedem Fall müssen wir möglicherweise eine Kalender-Tabelle verwenden, um Jahre zu erfassen, die vollständig fehlen. Ich denke, dass ein besseres Datenmodell darin besteht, alle Daten in einer einzigen Tabelle auf monatlicher Ebene zu speichern. Dann könnte ein Jahresdurchschnitt erreicht werden, indem man sich einfach über alle Monate eines bestimmten Jahres hinweg aggregiert.

1
SELECT s.valYear, (c.average - s.average) AS Difference 
FROM (SELECT EXTRACT(YEAR FROM date) AS valYear, AVG(averageTemperature) AS average 
     FROM state WHERE country = 'Africa' GROUP BY valYear 
    ) AS s, 
    (SELECT EXTRACT(YEAR FROM date) AS valYear, AVG(averageTemperature) AS average 
     FROM country WHERE country = 'Africa' GROUP BY valYear 
    ) AS c 
WHERE s.valYear = c.valYear 
Verwandte Themen