8-1ウィンドウ関数
■ 2 ORDER BYの
● 窓関数は、高い重合操作は、一般的に達成することができないシーケンス番号の関数で発生するようにソートすることができます。
● 理解BY PARTITION と、ORDER BYを非常に重要であることを意味二つのキーワード。
■ ウィンドウ関数は何ですか
OracleとSQL Serverの解析関数と呼ばれます。しかし、MySQLの5.7またはバージョンは、ウィンドウ関数をサポートしていません。
OLAPは、あるオンライン分析処理の手段リアルタイムのデータ分析および処理のためにデータベースという短いです。例えば、市場分析、事業計画およびその他のルーチンワークを作成し、財務諸表を作成します。
ウィンドウ関数は実装することであるOLAPは、標準の追加のSQL 関数を。
■ シンタックスウィンドウ関数を
窓関数は、次の2つに分けることができます。
①窓関数は、(集計関数として使用することができるSUM 、AVG 、COUNT 、MAX 、MIN )
② RANKの、DENSE _ RANKの、ROW _ NUMBER 他の専用窓関数
■ 文法の基本的な使用-使用してRANKの機能を
その名前が示すように、RANKの関数計算をソート記録するために使用されます。
例えば、以前に使用される製品の表8 の項目、私たちは製品の種類(依存せPRODUCT_TYPEを)、販売価格(に応じSALE_PRICE )ローからハイ順次結果を以下に示します。
PARTITION BYは、設定された目標範囲規則することができます。
ORDER BY 能够指定按照哪一列、何种顺序进行排序。可以通过关键字
ASC/DESC 来指定升序和降序。省略该关键字时会默认按照 ASC,也就是
升序进行排序。
■无需指定PARTITION BY
使用窗口函数时起到关键作用的是 PARTITION BY 和 GROUP BY。
其中, PARTITION BY 并不是必需的,也就是将整个表作为一个大的窗口来使用。
■专用窗口函数的种类
● RANK函数
计算排序时,如果存在相同位次的记录,则会跳过之后的位次。
例)有 3 条记录排在第 1 位时:1 位、1 位、1 位、4 位……
● DENSE_RANK函数
同样是计算排序,即使存在相同位次的记录,也不会跳过之后的位次。
例)有 3 条记录排在第 1 位时:1 位、1 位、1 位、2 位……
● ROW_NUMBER函数
赋予唯一的连续位次。
例)有 3 条记录排在第 1 位时:1 位、2 位、3 位、4 位……
除此之外,各 DBMS 还提供了各自特有的窗口函数。上述 3 个函数(对于支持窗口函数的 DBMS 来说)在所有的 DBMS 中都能够使用。
■窗口函数的适用范围
窗口函数只能书写在一个特定的位置,这个位置就是 SELECT 子句之中。
反过来说,就是这类函数不能在WHERE 子句或者 GROUP BY 子句中使用。
之所以在ORDER BY子句中能够使用窗口函数,是因为ORDER BY子句会在SELECT子句之后执行,并且记录保证不会减少。
■作为窗口函数使用的聚合函数
所有的聚合函数都能用作窗口函数,其语法和专用窗口函数完全相同。
在按照时间序列的顺序,计算各个时间的销售额总额等的时候,通常都会使用这种称为累计的统计方法。
使用其他聚合函数时的操作逻辑也和本例相同。例如,使用 AVG 来代替 SELECT 语句中的 SUM(代码清单 8-5)。
像这样以“自身记录(当前记录)”作为基准进行统计,就是将聚合函数当作窗口函数使用时的最大特征。
■计算移动平均
窗口函数就是将表以窗口为单位进行分割,并在其中进行排序的函数。
其实其中还包含在窗口中指定更加详细的汇总范围的备选功能,该备选功能中的汇总范围称为框架。
其语法如代码清单 8-6 所示,需要在 ORDER BY 子句之后使用指定范围的关键字。
●指定框架(汇总范围)
这里我们使用了 ROWS(“行”)和 PRECEDING(“之前”)两个关键
字,将框架指定为“截止到之前 ~ 行”,因此“ROWS 2 PRECEDING”
就是将框架指定为“截止到之前 2 行”,也就是将作为汇总对象的记录限
定为如下的“最靠近的 3 行”。
● 自身(当前记录)
● 之前1行的记录
● 之前2行的记录
也就是说,由于框架是根据当前记录来确定的,因此和固定的窗口不同,其范围会随着当前记录的变化而变化。
这样的统计方法称为移动平均(moving average)。由于这种方法在希望实时把握“最近状态”时非常方便,因此常常会应用在对股市趋势的实时跟踪当中。
使用关键字 FOLLOWING(“之后”)替换 PRECEDING,就可以指定“截止到之后 ~ 行”作为框架了。
●将当前记录的前后行作为汇总对象
具体来说,就是将如下 3 行作为汇总对象来进行计算
● 之前1行的记录
● 自身(当前记录)
● 之后1行的记录