2017-09-19 75 views
1

我有获得国家状态的国家和平均温度总体来说,每一年的两个SQL查询之间的区别州和国家每年。因此,例如:SQL两个查询

国家数据

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

状态数据

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

会产生:

差异

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

我试过做这样的事情,但它不会产生正确的答案。这可能会在这里工作

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' 

回答

3

一种方法是把你的两个查询到子查询,并加入他们的年:

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 

上面的查询具有一个黑客位感觉到它的。为了涵盖出现在一张表格中而不是另一张表格中的情况,我们将不得不求助于完整的外连接或丑陋的联合查询。无论如何,我们可能不得不使用日历表来涵盖完全缺失的年份。我觉得一个更好的数据模型就是将所有数据存储在一个表中,即月份级别。然后,可以通过在给定年份中累计所有月份来计算年平均值。

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