Oracle 按日期范围求和分组

标签 oracle oracle11g

我有下表

+-----------+-------+-------+
| Date      | Type  | Value |
+-----------+-------+-------+
| 1/1/2013  | A     | 1     |
| 1/2/2013  | A     | 3     |
| 1/3/2013  | A     | 5     |
| 1/4/2013  | A     | 6     |
| 1/6/2013  | A     | 8     |
| 1/7/2013  | A     | 1     |
| 1/8/2013  | A     | 2     |
+-----------+-------+-------+

我想对某一天的前 3 个日期的值求和,所以我使用了这个查询。 即:sel_date = 1/3/2013。

select type, sum(value)
from table_name
where date <= seldate
and date > seldate - 3
group by type

现在的问题是,我想输出一个表,其中包含每个日期前 3 天的给定日期范围计算。

即:选择日期范围 1/3/2013 - 1/8/2013

+-----------+-------+------------+
| Date      | Type  | Sum(Value) |
+-----------+-------+------------+
| 1/3/2013  | A     | 9          | // 5 + 3 + 1
| 1/4/2013  | A     | 14         | // 6 + 5 + 3
| 1/5/2013  | A     | 11         | // 0 + 6 + 5
| 1/6/2013  | A     | 14         | // 8 + 0 + 6
| 1/7/2013  | A     | 9          | // 1 + 8 + 0
| 1/8/2013  | A     | 11         | // 2 + 1 + 8
+-----------+-------+------------+

有没有办法在单个查询中执行此操作。我尝试阅读有关分区的内容,但它无处可去。

最佳答案

在窗口子句中使用range between:

select dt, type, value, 
       sum(value) over (order by dt range between 2 preceding and current row) as sv
  from t

测试数据和输出:

create table t (dt date, type varchar2(1), value number(5));
insert into t values (date '2013-01-01', 'A', 1);
insert into t values (date '2013-01-02', 'A', 3);
insert into t values (date '2013-01-03', 'A', 5);
insert into t values (date '2013-01-04', 'A', 6);
insert into t values (date '2013-01-05', 'A', 8);
insert into t values (date '2013-01-06', 'A', 1);
insert into t values (date '2013-01-07', 'A', 2);
insert into t values (date '2013-01-12', 'A', 2);

DT          TYPE  VALUE         SV
----------- ---- ------ ----------
2013-01-01  A         1          1
2013-01-02  A         3          4
2013-01-03  A         5          9
2013-01-04  A         6         14
2013-01-05  A         8         19
2013-01-06  A         1         15
2013-01-07  A         2         11
2013-01-12  A         2          2

关于Oracle 按日期范围求和分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36766772/

相关文章:

c# - 执行 pl/sql 查询时出现溢出错误

sql - 查询删除所有非数字但仅保留最后一个句点/点

docker - 配置Dockerfile在容器创建时使用impdp命令

mysql - 元素重复至少 3 次

database - 我应该对表进行分区/子分区吗?

java - 如何在 oracle 数据库中存储 BigInteger 值

显示工资变化的 SQL 触发器

mysql - 关于使用数据库进行 Junit 测试

oracle - 如何在 oracle 11G 中分隔逗号分隔值

sql - oracle中PL/SQL中文乱码