Hologres兼容PostgreSQL,支持使用標準的PostgreSQL語法進行開發。本文為您介紹Hologres已支持的窗口函數列表及使用用例。
關于兼容PostgreSQL的窗口函數的詳情,請參見窗口函數。
函數 | 功能 |
獲取當前行在窗口中的排名,生成的序號是連續的。 | |
獲取窗口第一行計算值。 | |
獲取指定值在窗口中當前行的前一行位置的值。 | |
獲取窗口最后一行計算值。 | |
獲取指定值在窗口中當前行的后一行位置的值。 | |
獲取當前行在窗口中的百分比排名 | |
獲取當前行在窗口中的排名,采用跳躍排序,生成的序號可能是不連續的。 | |
獲取當前行在窗口中的編號,從1開始計數。 |
示例數據
下文中函數的相關示例均基于test_wf
示例數據。以下是創建表test_wf
并添加數據的命令示例。
CREATE TABLE test_wf(
ID INT,
c1 TEXT
);
INSERT INTO test_wf ("id","c1") VALUES (1,'a'),(2,'b'),(3,'c'),(4,'d');
函數列表
ROW_NUMBER
描述:獲取當前行在窗口中的編號,從1開始計數。
ROW_NUMBER()
使用說明:Hologres從V1.1版本開始,HQE(Hologres Query Engine)提供支持。
返回值說明
返回BIGINT類型。
示例
SELECT c1, ROW_NUMBER() OVER (ORDER BY c1) FROM test_wf;
返回結果如下。
c1 | row_number ----+------------ a | 1 b | 2 c | 3 d | 4
RANK
描述:獲取當前行在窗口中的排名,采用跳躍排序,生成的序號可能是不連續的。
RANK()
使用說明:Hologres從V1.1版本開始,HQE(Hologres Query Engine)提供支持。
返回值說明
返回BIGINT類型。
示例
SELECT c1, RANK() OVER (ORDER BY c1) FROM test_wf;
返回結果如下。
c1 | rank ----+------ a | 1 b | 2 c | 3 d | 4
DENSE_RANK
描述:獲取當前行在窗口中的排名,生成的序號是連續的。
DENSE_RANK()
使用說明:Hologres從V1.1版本開始,HQE(Hologres Query Engine)提供支持。
返回值說明
返回BIGINT類型。
示例
SELECT c1, DENSE_RANK() OVER (ORDER BY c1) FROM test_wf;
返回結果如下。
c1 | dense_rank ----+------------ a | 1 b | 2 c | 3 d | 4
PERCENT_RANK
描述:獲取當前行在窗口中的百分比排名
(rank-1)/(總分區行-1)
。PERCENT_RANK()
使用說明
PQE(Postgres Query Engine)提供支持。
返回值說明
返回DOUBLE PRECISION類型。
示例
SELECT c1, PERCENT_RANK() OVER (ORDER BY c1) FROM test_wf;
返回結果如下。
c1 | percent_rank ----+------------------- a | 0 b | 0.333333333333333 c | 0.666666666666667 d | 1
LAG
描述:獲取指定值在窗口中當前行的前一行位置的值。
LAG(<value> ANYELEMENT [, <offset> INTEGER [, <default> ANYELEMENT]])
使用說明
Hologres從V1.1.71版本開始,HQE(Hologres Query Engine)提供支持。
參數說明
value:必填,需要獲取前一行值的列或表達式。
offset:可選,指定向前偏移的行數,即獲取直接前一行的值,默認值為1。
default:可選,當查詢的行是分組的第一行,沒有前一行時,可以指定一個默認值返回,默認值為空。
示例
SELECT c1, LAG(c1) OVER (ORDER BY c1) FROM test_wf;
返回結果如下。
c1 | lag ----+----- a | b | a c | b d | c
LEAD
描述:獲取指定值在窗口中當前行的后一行位置的值。
LEAD(<value> ANYELEMENT [, <offset> INTEGER [, <default> ANYELEMENT]])
使用說明
Hologres從V1.1.71版本開始,HQE(Hologres Query Engine)提供支持單入參場景。
參數說明
value:必填,需要獲取前一行值的列或表達式。
offset:可選,指定向后偏移的行數,即獲取下一行的值,默認值為1。
default:可選,當查詢的行是分組的最后一行,沒有后一行時,可以指定一個默認值返回,默認值為空。
示例
SELECT c1, LEAD(c1) OVER (ORDER BY c1) FROM test_wf;
返回結果如下。
c1 | lead ----+------ a | b b | c c | d d |
FIRST_VALUE
描述:獲取窗口第一行計算值。
FIRST_VALUE(<value> ANYELEMENT)
使用說明
Hologres從V1.1.71版本開始,HQE(Hologres Query Engine)提供支持。
示例
SELECT c1, FIRST_VALUE(c1) OVER (ORDER BY c1) FROM test_wf;
返回結果如下。
c1 | first_value ----+------------- a | a b | a c | a d | a
LAST_VALUE
描述:獲取窗口最后一行計算值。
LAST_VALUE(<value> ANYELEMENT)
使用說明
Hologres從V1.1.71版本開始,HQE(Hologres Query Engine)提供支持。
示例
SELECT c1, LAST_VALUE(c1) OVER (ORDER BY c1) FROM test_wf;
返回結果如下。
c1 | last_value ----+------------ a | a b | b c | c d | d
窗口函數特性
調用窗口函數時,需要在窗口函數及其參數后增加一個OVER子句。OVER子句決定了查詢結果中的哪些行需要被分離出來,由窗口函數處理。
當OVER子句使用分區子句
PARTITION BY
時,分區列值相同的行歸屬同一窗口。對于每一行,窗口函數都會針對其所在窗口進行計算。當OVER子句使用排序子句
ORDER BY
時,窗口函數會按其定義的順序處理行。
對于每一行,在其窗口中的行集被稱為窗口幀。針對部分窗口函數,只會作用于當前行所在的窗口幀,而非整個窗口。在使用排序子句ORDER BY的情況下,窗口幀默認為從窗口開始到當前行的范圍;如果沒有定義排序,則窗口幀默認為當前窗口的所有行。
以SUM函數為例,是否使用排序子句查詢得到的結果如下表。
示例1
SELECT id, c1, SUM(id) OVER (ORDER BY id) FROM test_wf;
返回結果如下。
id | c1 | sum ----+----+----- 1 | a | 1 2 | b | 3 3 | c | 6 4 | d | 10
示例2
SELECT id, c1, SUM(id) OVER () FROM test_wf;
返回結果如下。
id | c1 | sum ----+----+----- 3 | c | 10 1 | a | 10 2 | b | 10 4 | d | 10
如上所示,當使用排序子句時,求和值為第一行(最小值)到當前行的和,并且包括與當前行具有相同值的行;當不使用排序子句時,每次求和都針對整個表。