`
wayJava
  • 浏览: 29264 次
  • 性别: Icon_minigender_1
  • 来自: 福建
最近访客 更多访客>>
社区版块
存档分类
最新评论

over 之rows 与range窗口区别

阅读更多
select * from t order by t.area_code,t.bill_month;
-- 逻辑范围  根据order by 中的字段计算逻辑上的范围
/*
如下表中数据实际只有5,6,8月分的
月分   计算范围  实际
5      4+5+6     5+6
6      5+6+7     5+6
8      7+8+9     8
*/
select area_code,bill_month,sum(countId) over(partition by area_code order by bill_month range between 1 preceding and 1 following)
 from(
select 
       t.area_code,t.bill_month,count(area_code) as countId
       from t group by t.area_code,t.bill_month
       
       );
 -- 物理范围,根据行找      
select area_code,bill_month,sum(countId) over(partition by area_code order by bill_month rows between 1 preceding and 1 following)
 from(
select 
       t.area_code,t.bill_month,count(area_code) as countId
       from t group by t.area_code,t.bill_month
       
       );

 

create table t(
       bill_month number, 
       area_code number,
       net_type char, 
       local_fare number
);


declare
  i      number;
  period number := 200405;
  a_code number := 5060;
  v_type char(1) := 'G';
  num    number;
  k      number;
begin
  
  for k in 0 .. 3 loop
    period := period+k;
    a_code := 5060;
    for i in 0 .. 9 loop
      if mod(i, 2) = 0 then
        a_code := a_code + 1;
      end if;
      if (mod((i + 1), 2) != 0) then
        v_type := 'J';
      end if;
      if (mod((i + 1), 2) = 0) then
        v_type := 'G';
      end if;
      num := DBMS_RANDOM.RANDOM;
      num := num / 100;
      if num < 0 then
        num := -1 * num;
      end if;
      insert into t
        (bill_month, area_code, net_type, local_fare)
      values
        (period, a_code, v_type, num);
    end loop;
  end loop;
  commit;

end;

 

range前的order by 字段只能是数字吗?
转成日期比较会出错,那要统计如“201001”时,就统计不到200912了,这种情况该如何解决

 

分享到:
评论

相关推荐

    over函数的使用

    - **RANGE**定义了一个基于值的窗口范围,即考虑那些与当前行具有相似值的行。 - **ROWS**则基于行的位置来定义窗口范围,即考虑固定数量的前/后行。 #### 示例代码解析 ```sql SELECT emp_id, salary, SUM(salary...

    ORACLE_OVER函数

    3. **ROWS BETWEEN** / **RANGE BETWEEN**:指定窗口的范围,即计算时考虑的行数范围。 #### 四、OVER函数示例 由于题目提供的部分内容中没有具体示例,以下是一些典型的使用场景示例。 ##### 示例1:使用ROW_...

    Orcal中over函数.doc

    - `ROWS` 或 `RANGE`:可选,用于定义窗口的范围,即参与计算的数据行数。 #### 三、简单示例 首先,我们来看一个简单的例子,理解OVER函数的基本用法。 ##### 示例1:简单的OVER函数应用 假设有一个名为`emp`的...

    T-SQL性能调优秘笈 基于SQL Server 2012窗口函数

    - `ROWS` 或 `RANGE`:定义窗口的大小,即函数应用于哪些行。 #### 三、窗口函数的应用场景 1. **计算累积总和**: ```sql SELECT SaleDate, SalesAmount, SUM(SalesAmount) OVER (ORDER BY SaleDate) AS ...

    Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数(转载)

    除了基本的使用外,`OVER (PARTITION BY ...)` 还支持更复杂的窗口定义,比如使用 `ROWS BETWEEN` 或 `RANGE BETWEEN` 来指定窗口范围。 ##### 1. ROWS BETWEEN 和 RANGE BETWEEN - **ROWS BETWEEN**:基于行的...

    大数据hive中窗口函数的一些常用函数

    * 窗口范围指定了窗口函数的范围,可以使用ROWS或RANGE关键字指定。 * 窗口函数可以与聚合函数结合使用,例如计算累计销售额。 窗口函数是Hive中一种强大的分析工具,能够对数据进行复杂的分析和计算。通过学习和...

    oracle分析函数over_及开窗函数.txt

    - **`ROWS BETWEEN`和`RANGE BETWEEN`**:这两种方法都允许我们定义窗口的范围,但计算方式略有不同。 - `ROWS BETWEEN`:按照行数来定义窗口。 - `RANGE BETWEEN`:按照值的差异来定义窗口。 例如,如果我们要...

    Hive窗口函数,定义、demo

    在Hive中,窗口的定义主要通过`OVER()`子句配合`ROWS BETWEEN`或`RANGE BETWEEN`来实现。 `ROWS BETWEEN`用于基于物理行数来定义窗口,例如: ```sql ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ``` 表示...

    SQL窗口函数速查表.pdf

    - **ROWS/RANGE BETWEEN**:定义窗口的范围,例如前N行、后N行,或者基于值的范围。 3. **应用场景** - **行间计算**:例如,计算每个部门员工的薪水排名。 - **滑动窗口聚合**:例如,计算过去7天的日销售额之...

    使用over函数实现递归汇总计算

    - **无限范围**:`OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)` 或 `OVER (ORDER BY salary RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)` 表示计算窗口覆盖...

    ORACLE OLAP函数语法的总结

    RANGE窗口也用于定义窗口的范围,但其考虑的是值域而非行数。 - **Range Unbounded Preceding**:将当前行之前的所有行包含进窗口。 ```sql SELECT deptno, ename, sal, SUM(sal) OVER (PARTITION BY deptno ORDER...

    SQL中窗口函数的使用

    窗口大小可以基于当前行设置,如`ROWS BETWEEN`和`RANGE BETWEEN`。`UNBOUNDED PRECEDING`和`UNBOUNDED FOLLOWING`表示从分区开始或结束,而`N PRECEDING`和`N FOLLOWING`则指定具体的行数。`GROUPS`选项在...

    Oracle9i分析函數(二)

    窗口函数通过`OVER`子句来定义,`OVER`子句可以包含`PARTITION BY`、`ORDER BY`以及`RANGE`或`ROWS`子句来确定数据窗口的范围。 例如: 1. `OVER (ORDER BY salary)`:按工资排序进行累计,`ORDER BY`定义了数据...

    Oracle分析函数

    - **窗口定义**(`ROWS`或`RANGE`子句):用于定义函数作用的行范围,这是分析函数的核心部分之一。 #### 三、PARTITION BY 子句 `PARTITION BY`子句是分析函数中最基础也是最常用的子句之一,它决定了数据如何被...

    ORACLE9i-分析函数参考手册-物化视图-Flashback Query.doc

    5. `OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)` 或 `OVER (ORDER BY salary RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)` 表示从数据集的第一行到最后一...

    ORACLE分析函数大全[收集].pdf

    数据窗口可以通过`OVER`子句进行定义,并且可以指定排序依据(ORDER BY)、分区(PARTITION BY)以及行范围(ROWS BETWEEN或RANGE BETWEEN)。以下是一些数据窗口的示例: 1. `OVER (ORDER BY salary)`:按照薪资...

    Oracle_分析函数

    - 窗口子句:用于定义窗口函数的范围,可以是基于范围(range)或基于行(rows)。 2. 窗口函数: 窗口函数是在窗口(一个特定的数据库结果集片段)上操作的函数。它们作用于一系列行,并返回一系列值。通过定义...

    Oracle 9i 分析函数参考手册

    - `OVER (ORDER BY salary RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING)` 创建一个窗口,其中包含当前行以及薪资值在当前行前后50到150范围内的行。 - `OVER (ORDER BY salary ROWS BETWEEN 50 PRECEDING AND 150...

    SQL开窗函数详解.pdf

    - **ROWS | RANGE**:定义窗口的范围,可以是基于行数的前后范围或是基于值的前后范围。 #### 三、常见开窗函数及应用场景 1. **ROW_NUMBER()**:为每一行分配一个唯一的序号,常用于生成行号或分页等操作。 - ...

    ORACLE分析函数

    MAX(sal) OVER (ORDER BY hiredate ASC RANGE 100 PRECEDING) max_sal_100_days_before, MIN(sal) OVER (ORDER BY hiredate DESC RANGE 100 PRECEDING) min_sal_100_days_after FROM emp ORDER BY hiredate ASC;...

Global site tag (gtag.js) - Google Analytics