要计算表格中的平均角度(以[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)
答案 0 :(得分:0)
UNION
运算符可以消除重复的条目。
来自the documentation [强调我的]:
UNION有效地将query2的结果附加到query1的结果中(尽管不能保证这是实际返回行的顺序)。 此外,它会以与DISTINCT相同的方式消除其结果中的重复行,除非使用UNION ALL。
因此,如果使用UNION ALL
,则意外结果的解释是显而易见的:
246.670436944698
250.0
240.0
250.0