SQL 移动平均线

标签 sql hive moving-average

如何在 SQL 中创建移动平均线?

当前表:

Date             Clicks 
2012-05-01       2,230
2012-05-02       3,150
2012-05-03       5,520
2012-05-04       1,330
2012-05-05       2,260
2012-05-06       3,540
2012-05-07       2,330

所需的表或输出:
Date             Clicks    3 day Moving Average
2012-05-01       2,230
2012-05-02       3,150
2012-05-03       5,520          4,360
2012-05-04       1,330          3,330
2012-05-05       2,260          3,120
2012-05-06       3,540          3,320
2012-05-07       2,330          3,010

最佳答案

这是 Evergreen Joe Celko 的问题。
我忽略使用的是哪个 DBMS 平台。但无论如何,Joe 能够在 10 多年前用标准 SQL 回答。

Joe Celko SQL Puzzles and Answers citation: "That last update attempt suggests that we could use the predicate to construct a query that would give us a moving average:"


SELECT S1.sample_time, AVG(S2.load) AS avg_prev_hour_load
FROM Samples AS S1, Samples AS S2
WHERE S2.sample_time
BETWEEN (S1.sample_time - INTERVAL 1 HOUR)
AND S1.sample_time
GROUP BY S1.sample_time;

Is the extra column or the query approach better? The query is technically better because the UPDATE approach will denormalize the database. However, if the historical data being recorded is not going to change and computing the moving average is expensive, you might consider using the column approach.



MS SQL 示例:
CREATE TABLE #TestDW
( Date1 datetime,
  LoadValue Numeric(13,6)
);

INSERT INTO #TestDW VALUES('2012-06-09' , '3.540' );
INSERT INTO #TestDW VALUES('2012-06-08' , '2.260' );
INSERT INTO #TestDW VALUES('2012-06-07' , '1.330' );
INSERT INTO #TestDW VALUES('2012-06-06' , '5.520' );
INSERT INTO #TestDW VALUES('2012-06-05' , '3.150' );
INSERT INTO #TestDW VALUES('2012-06-04' , '2.230' );

SQL拼图查询:
SELECT S1.date1,  AVG(S2.LoadValue) AS avg_prev_3_days
FROM #TestDW AS S1, #TestDW AS S2
WHERE S2.date1
    BETWEEN DATEADD(d, -2, S1.date1 )
    AND S1.date1
GROUP BY S1.date1
order by 1;

关于SQL 移动平均线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10624902/

相关文章:

sql - 使用嵌套循环提高 SQL 查询的性能 - PostgreSQL

python - 我正在尝试使用提供的 json 文件中的数据创建数据库

mysql - mysql中的高级选择查询

mysql - 最多的电影属于哪个等级?

r - 如何使用自定义权重计算加权移动平均值?

Pandas 5 年和 10 年移动平均线

hadoop - hive :提取数据时出错

sql - 根据 Hive 中 2 个源表的一些规则更新目标中的 "flag"

tomcat - 如何在没有 ClassNotFound 异常的 Apache Tomcat 中配置 Impala/Hive2 JDBC 驱动程序

r - 为 R 中的 signal::filter 函数提供初始值