(显然)相等输入数据的不同结果?

时间:2012-10-12 09:31:49

标签: postgresql

要计算表格中的平均角度(以[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 ......所以我用另外相同的输入数据进行了另一次测试:

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

输出显示(非)预期结果:

245.0
250.0
240.0

任何人都可以向我解释这个吗? (这是PostgreSQL 8.4)

1 个答案:

答案 0 :(得分:0)

UNION运算符可以消除重复的条目。

来自the documentation [强调我的]:

  

UNION有效地将query2的结果附加到query1的结果中(尽管不能保证这是实际返回行的顺序)。 此外,它会以与DISTINCT相同的方式消除其结果中的重复行,除非使用UNION ALL。

因此,如果使用UNION ALL,则意外结果的解释是显而易见的:

246.670436944698
250.0
240.0
250.0