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

テストに関しては、yahoo の気象データを含むテーブルを試しました。

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 なのか疑問に思ったので、明らかに等しい入力データを使用して別のテストを実行しました。

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

出力は、(予期しない) 予期しない結果を示しました。

245.0
250.0
240.0

誰かが私にこれを説明できますか? (これは PostgreSQL 8.4 です)

4

1 に答える 1

0

オペレーターはUNION重複エントリーを排除します。

ドキュメントから[強調鉱山]:

UNION は、query2 の結果を query1 の結果に効果的に追加します (ただし、これが行が実際に返される順序であるという保証はありません)。さらに、 UNION ALL が使用されていない限り、DISTINCT と同じ方法で、結果から重複する行を削除します。

したがって、UNION ALLが使用されている場合、予期しない結果の説明は明らかです。

246.670436944698
250.0
240.0
250.0
于 2012-10-12T11:30:49.943 に答える