我想获得按reg、日期和小时划分的加速度的标准差。因此,我希望使用以下代码根据这些分区获得统一的值,但我为每一行获得不同的值:
SELECT *,
STDDEV(ACCELERATION)OVER(PARTITION BY REG, DATE, HOUR ORDER BY TIMESTAMP)
FROM
(
SELECT
*,
SPEED_DIFFERENCE/ TIMESTAMP_DIFFERENCE AS ACCELERATION
FROM
(
SELECT *,
NEXT_MILES_PER_HOUR - MILES_PER_HOUR AS SPEED_DIFFERENCE,
TIMESTAMPDIFF(second,timestamp,Next_timestamp) AS TIMESTAMP_DIFFERENCE
FROM
(
SELECT *,
TO_TIME (DATE_AND_HOUR) AS HOUR,
LEAD(TIMESTAMP)OVER (PARTITION BY VIN ORDER BY TIMESTAMP) AS NEXT_TIMESTAMP,
LEAD(MILES_PER_HOUR)OVER (PARTITION BY REG ORDER BY TIMESTAMP) AS NEXT_MILES_PER_HOUR
FROM
(
SELECT Reg,
TIMESTAMP,
Miles_per_hour
TO_DATE (TIMESTAMP) AS DATE,
TO_TIME (TIMESTAMP) AS TIME,
date_trunc('HOUR', TIMESTAMP) as DATE_AND_Hour,
DATA
FROM Motorycle_Data_Refurbished_Models_DuPage_County
)
)
)
)
最佳答案
要为每个分区获取单个值,应删除 ORDER BY,因为它将函数切换为累积函数:
SELECT *,
STDDEV(ACCELERATION)OVER(PARTITION BY REG, DATE, HOUR)
...
示例:
CREATE OR REPLACE TABLE t(i INTEGER);
INSERT INTO t (i) VALUES (6), (10), (14);
SELECT STDDEV(i) OVER(ORDER BY i) FROM t;
输出:
对比
SELECT STDDEV(i) OVER() FROM t;
输出:
应用于 STDDEV 时的 ORDER BY :
If the OVER clause contains an ORDER BY subclause, then:
A window frame is required. If no window frame is specified explicitly, then the ORDER BY implies a cumulative window frame:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
窗口正在从分区的开头移动到当前行。
可以覆盖它:
SELECT STDDEV(i) OVER(ORDER BY i
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
FROM t;
输出:
关于sql - Snowflake 中的 STDDEV Windows 函数 : not getting a uniform value according to the partition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72716722/