2012-10-12 46 views
0

計算平均角度表(以度角[0, 360])我用以下語句:(顯然)等於輸入數據的不同結果?

SELECT 
    (CASE WHEN (a < 0.0) 
    THEN a + 360.0 
    ELSE a END) as angle 
FROM (
    SELECT 
     degrees(atan2(avg(sin(radians(x))), avg(cos(radians(x))))) as a 
    FROM 
     angle_t 
    ) as t 
UNION 
SELECT 
    x 
FROM 
    angle_t 

,當它來測試我試圖包含雅虎的氣象資料我的表:

WITH angle_t(x) AS (
    SELECT 
     cast(wind_direction as double precision) 
    FROM 
     weather_yahoo 
    WHERE 
     time >= current_date - interval '1 days' - interval '1 hours' 
    AND 
     time <= current_date - interval '1 days') 

輸出是:

246.670436944698 
250.0 
240.0 

我想知道爲什麼平均角不是245但246.67 ...所以我跑了另一個測試與ap parantly等於輸入數據:

WITH angle_t(x) AS (VALUES 
    (240 :: double precision), 
    (250)) 

輸出顯示(未)預期的結果:

245.0 
250.0 
240.0 

任何人都可以給我講解一下? (這是PostgreSQL 8.4)

+1

沒有數據和表格。定義它還挺硬。 SQLFiddle呢? –

+0

從你的問題你運行兩種不同的解決方案相同的輸入。您的標題有誤導性。 – Kuberchaun

+0

@JustBob事實證明,它不是相同的輸入,但它看起來像相同的輸入。這就是爲什麼我把(顯然)_。 – moooeeeep

回答

0

UNION運算符消除重複條目。

the documentation [重點煤礦]:

UNION有效地追加到QUERY2的QUERY1結果的結果(雖然沒有保證,這是該行實際返回的順序)。 此外,除非使用UNION ALL,否則它將以與DISTINCT相同的方式從其結果中消除重複的行。

因此,如果使用UNION ALL,對於意外結果的解釋是顯而易見的:

246.670436944698 
250.0 
240.0 
250.0 
相關問題