sql - 给定时间间隔内的汇总函数

标签 sql oracle oracle10g aggregate

我的SQL有点生锈,我在解决这个问题上遇到了很多困难。假设我有一个带有Timestamp列和Number列的表。目的是返回一个结果集,该结果集包含某个任意选择的规则间隔的平均值。

因此,例如,如果我有以下初始数据,则以5分钟为间隔的结果输出如下:

time                               value
-------------------------------    -----
06-JUN-12 12.40.00.000000000 PM      2
06-JUN-12 12.41.35.000000000 PM      3
06-JUN-12 12.43.22.000000000 PM      4
06-JUN-12 12.47.55.000000000 PM      5
06-JUN-12 12.52.00.000000000 PM      2
06-JUN-12 12.54.59.000000000 PM      3
06-JUN-12 12.56.01.000000000 PM      4

OUTPUT:

start_time                         avg_value
-------------------------------    ---------
06-JUN-12 12.40.00.000000000 PM      3
06-JUN-12 12.45.00.000000000 PM      5
06-JUN-12 12.50.00.000000000 PM      2.5
06-JUN-12 12.55.00.000000000 PM      4

请注意,这是一个Oracle数据库,因此特定于Oracle的解决方案可以正常工作。当然,这可以通过存储过程来完成,但是我希望在单个查询中完成任务。

最佳答案

CREATE TABLE tt (time TIMESTAMP, value NUMBER);

INSERT INTO tt (time, value) VALUES ('06-JUN-12 12.40.00.000000000 PM', 2);
INSERT INTO tt (time, value) VALUES ('06-JUN-12 12.41.35.000000000 PM', 3);
INSERT INTO tt (time, value) VALUES ('06-JUN-12 12.43.22.000000000 PM', 4);
INSERT INTO tt (time, value) VALUES ('06-JUN-12 12.47.55.000000000 PM', 5);
INSERT INTO tt (time, value) VALUES ('06-JUN-12 12.52.00.000000000 PM', 2);
INSERT INTO tt (time, value) VALUES ('06-JUN-12 12.54.59.000000000 PM', 3);
INSERT INTO tt (time, value) VALUES ('06-JUN-12 12.56.01.000000000 PM', 4);


WITH tmin AS (
    SELECT MIN(time) t FROM tt
),   tmax AS (
    SELECT MAX(time) t FROM tt
)
SELECT ranges.inf, ranges.sup, AVG(tt.value)
FROM
     (
        SELECT 
            5*(level-1)*(1/24/60) + tmin.t as inf,
            5*(level)*(1/24/60) + tmin.t as sup
        FROM tmin, tmax
        CONNECT BY (5*(level-1)*(1/24/60) + tmin.t) < tmax.t
    ) ranges JOIN tt ON tt.time BETWEEN ranges.inf AND ranges.sup
GROUP BY ranges.inf, ranges.sup
ORDER BY ranges.inf

fiddle :http://sqlfiddle.com/#!4/9e314/11

编辑:像往常一样被贾斯汀殴打... :-)

关于sql - 给定时间间隔内的汇总函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11215272/

相关文章:

mysql - 如何将这两个查询语句合并为一个查询语句

sql - SQL 中的事务和回滚

oracle - 有条件地定义一个游标

java - "loader constraints violated when linking javax/xml/namespace/QName class"来自 Oracle 10g 上的 webapp

sql - PL/SQL 新手 - 返回多个结果集问题

java - 使复选框仅在sql中对应5列

SQL Server 聚合性能

sql - 在表中保存嵌套 XML 时出现 PL/SQL 错误

java - Oracle JDBC 事务管理和提交 session

plsql - PLS-00123 : program too large (Diana nodes) while trying to compile a package