5 Function前端
指數據庫內置的function,不討論UDF。另外,操做符都不比較了,區別不大。正則表達式
5.1 數學函數sql
功能數據庫 |
Oracleexpress |
Hive後端 |
Impala數組 |
ABSsession |
絕對值,有oracle |
有函數 |
有 |
SIN/SINH/ASIN/COS/COSH/ACOS/TAN/TANH/ATAN/ATAN2 |
三角函數 其中ATAN2接受兩個參數(二維平面中的座標) |
沒有SINH/COSH/TANH/ATAN2 |
同hive |
BITAND |
按位與,有 |
|
|
CEIL |
天花板值,有 |
有,還有個別名CEILING |
有,同hive |
EXP |
e的多少次,有 |
有,還有個函數E()返回e |
有,同hive |
FLOOR |
地板值,有 |
有 |
有 |
LN |
以e爲底的log,有 |
有 |
有 |
LOG |
以某個double爲底的log,有 |
有,還有兩個特殊底的log:LOG2和LOG10 |
有,同hive |
MOD |
Oracle的MOD的計算方式爲MOD(n2,n1)=n2 - n1 * FLOOR(n2/n1),這與經典取模還不一樣,好比Oracle的MOD(-11,4)=-3,但經典取模等於1 |
在hive裏取模用PMOD,返回值必定是個正數,好比PMOD(-11,4)=1。但這與經典取模仍是不一樣,好比PMOD(-11,-4)=1,但經典取模等於-3 |
Impala的PMOD和hive的PMOD相同,另外Impala還有個FMOD和Oracle的MOD相同 |
POWER |
求冪,有 |
有,還有個別名POW |
有,同hive |
REMAINDER |
取餘,REMAINDER(n2,n1)=n2 - n1 * FLOOR(n2/n1) |
|
|
ROUND |
舍入,支持1個參數和2個參數兩種版本 |
有 另外還有一個BROUND,使用HALF_EVEN舍入模式,見官方手冊 |
有,同Oracle |
SIGN |
符號函數,有 |
有 |
有 |
SQRT |
開方,有 |
有 |
有 |
TRUNC |
截取數值的小數點後多少位(若是是負值則往前推) |
|
|
DEGREES/RADIANS |
|
角度/弧度互轉 |
同hive |
POSITIVE/NEGATIVE |
|
至關於在數值前加+/-號(所以沒什麼卵用) |
同hive |
PI |
|
返回pi值 |
同hive |
FACTORIAL |
|
階乘,1.2.0之後纔有 |
|
CBRT |
|
求立方根,1.2.0之後纔有 |
|
SHIFTLEFT/SHIFTRIGHT/SHIFTRIGHTUNSIGNED |
|
按位左移/右移/無符號右移 |
|
GREATEST/LEAST |
返回一串值中的最大/最小值,這串值的類型能夠是任意,只要可比較大小(因此其實不是數學函數而是通用比較) |
有,1.1.0之後 |
有 |
5.2 字符(串)函數
功能 |
Oracle |
Hive |
Impala |
ASCII |
輸入必須char,返回該字符的ascii數值 |
輸入String,返回該String第一個字符的ascii數值 |
同hive |
BASE64 / UNBASE64 |
|
將二進制值轉爲base64的String(UN則是反向) |
|
CONCAT |
CONCAT(char1, char2) char或char2都可爲CHAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB, or NCLOB之一 |
concat(string|binary A, string|binary B...) 能夠有多個參數 另外提供CONCAT_WS用於指定特殊分隔符的鏈接 |
同hive(除了不支持binary類型),且也有CONCAT_WS |
DECODE/ENCODE |
|
string decode(binary bin, string charset) binary encode(string src, string charset) 編碼和解碼用的,用於支持hive特有的binary類型 |
(其實oracle和impala也有DECODE,但做用徹底不一樣,見條件函數中的DECODE) |
FIND_IN_SET |
|
find_in_set(string str, string strList) strList是用’,’分割的一組string,該函數將尋找strList中第一個精確匹配的str |
同hive |
FORMAT_NUMBER |
|
將數字格式化爲string |
|
GET_JSON_OBJECT |
|
抽取JSON對象,不經常使用 |
|
IN_FILE |
|
in_file(string str, string filename) 檢測str是否爲filename對應文件中的某行,不經常使用 |
|
INITCAP |
將每一個單詞(以空白分隔)轉換爲首字母大寫其他小寫的形式 |
同oracle,1.1.0開始有 |
同oracle |
INSTR |
{ INSTR | INSTRB | INSTRC | INSTR2 | INSTR4 } (string , substring [, position [, occurrence ] ]) 搜索子串,不一樣數據類型調用名不一樣,最多可帶四個參數,其中第三個是開始位置,第四個是出現的第幾回 |
instr(string str, string substr) 只接受兩個參數 |
同hive |
LENGTH |
{ LENGTH | LENGTHB | LENGTHC | LENGTH2 | LENGTH4 } (char) 串長,不一樣數據類型調用名不一樣 |
有(僅LENGTH) |
同hive |
LEVENSHTEIN |
|
返回兩個串的Levenshtein距離(編輯距離)1.2.0後纔有 |
|
LOCATE |
|
特殊狀況的INSTR,能夠指定匹配的開始位置。Oracle由於原本INSTR就支持因此並不須要該函數 |
同hive |
LOWER |
轉小寫 |
有,且有一個別名叫LCASE |
同hive |
LPAD / RPAD |
LPAD(expr1, n [, expr2 ]) 在expr1以前用expr2填充n個字符,如expr2省略默認用n個單空格填充。RPAD相似只是在右邊 |
有,但expr2不能省略 |
同hive |
LTRIM / RTRIM |
LTRIM(char [, set ]) 去掉char左側包含在set中的字符,如省略set,則只去除空格符。RTRIM相似只是在右邊 |
有,但沒有set參數,即只能去除空格符 |
同hive |
PARSE_URL |
|
抽取URL,能夠指定抽取URL的類型和建名 |
同hive |
PRINTF |
|
按格式打印對象數組 |
|
REGEXP_EXTRACT / REGEXP_SUBSTR |
REGEXP_SUBSTR(source_char, pattern [, position [, occurrence [, match_param [, subexpr ] ] ] ] ) 按正則表達式抽取字符串,並返回其中一部分。注意Oracle和hive/impala中函數名不一樣 |
regexp_extract(string subject, string pattern, int index) 相似Oracle,但不能指定起始位置,替換序號和匹配參數 |
同hive |
REGEXP_REPLACE |
REGEXP_REPLACE(source_char, pattern [, replace_string [, position [, occurrence [, match_param ] ] ] ] ) 按正則表達式替換字符串中的一部分 |
regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT) 相似Oracle,但不能指定起始位置,替換序號和匹配參數 |
同hive |
REGEXP_COUNT |
REGEXP_COUNT (source_char, pattern [, position [, match_param]]) 按正則表達式對字符串中子串的出現次數計數 |
|
|
REGEXP_INSTR |
REGEXP_INSTR (source_char, pattern [, position [, occurrence [, return_opt [, match_param [, subexpr] ] ] ] ] ) 在字符串中查找知足正則表達式的子串第一次出現的位置 |
|
|
REPEAT |
|
重複n次 |
同hive |
REPLACE |
簡單替換文本 |
|
|
REVERSE |
|
返回逆串 |
同hive |
SENTENCES |
|
簡單的分詞功能,很奇怪hive爲什麼提供這樣的功能 |
|
SOUNDEX |
取英文中的「諧音」,多是用於存在髒數據時的匹配吧,詭異的功能 |
有,1.2.0之後 |
|
SPACE |
|
返回n個空格 |
同hive |
SPLIT |
|
使用正則表達式分割字符串 |
|
STR_TO_MAP |
|
將字符串轉爲鍵值對 |
|
STRLEFT / STRRIGHT |
|
|
返回最左/最右的n個字符,是SUBSTR的簡化版 |
SUBSTR / SUBSTRING |
{ SUBSTR | SUBSTRB | SUBSTRC | SUBSTR2 | SUBSTR4 } (char, position [, substring_length ]) 不一樣數據類型調用名不一樣 |
相似Oracle,只有SUBSTR和其別名SUBSTRING |
同hive |
SUBSTRING_INDEX |
|
substring_index(string A, string delim, int count) 返回A在delim出現第count次前的部分,1.3.0後纔有 |
|
TRANSLATE |
TRANSLATE(expr, from_string, to_string) 將expr,按from_string中出現的每一個字符替換爲to_string中對應序號的字符 Oracle還有種TRANSLATE...USING語法是其餘兩個沒有的 |
同oracle |
同oracle |
TRIM |
TRIM([ { { LEADING | TRAILING | BOTH } [ trim_character ] | trim_character} FROM ] trim_source) 比較靈活,可指定去除前端仍是後端,去除什麼字符。若是隻留trim_source一個參數則等同於後二者 |
trim(string A) 簡單去除A先後的空白 |
同hive |
UPPER |
轉大寫 |
有,且有一個別名LCASE |
同hive |
5.3 日期函數
功能 |
Oracle |
Hive |
Impala |
ADD_MONTHS |
在某日期上加上n個月 |
有,1.1.0之後 |
有 |
CURRENT_DATE |
返回當前時間(和session的時區相關),精確到秒 |
返回當前時間(sql評估時的時間,同一個查詢中屢次調用該函數值相同),1.2.0之後 |
|
CURRENT_TIMESTAMP |
返回當前時間(和session的時區相關),精確到毫秒,返回類型爲TIMESTAMP WITH TIME ZONE |
返回當前時間(sql評估時的時間,同一個查詢中屢次調用該函數值相同,精確到毫秒),1.2.0之後 |
有,另有一個別名NOW |
DATE_ADD / DATE_SUB |
|
在某日期上加/減n天 |
同hive,可接收timestamp或string類型。 只接收timestamp類型的該函數有兩套,稱爲DAYS_ADD/DAYS_SUB,ADDDATE/SUBDATE(真不懂impala搞這麼多名字雷同的東西幹啥) |
DATE_FORMAT |
|
用格式字符串格式化日期(可爲date/timestamp/string) |
|
DATE_PART |
|
|
省略order參數的EXTRACT |
DATEDIFF |
|
求兩個日期間差的天數 |
同hive |
DAY / DAYOFMONTH |
|
返回該日期在月內的日數,兩個函數同義 |
同hive |
DAYNAME |
|
|
返回周間的名字,即’Sunday’到’Saturday‘ |
DAYOFWEEK |
|
|
返回周間的序號,1(Sunday)到7(Saturday) |
DAYOFYEAR |
|
|
返回是本年第幾天 |
DBTIMEZONE |
數據庫當前時區 |
|
|
EXTRACT |
EXTRACT( { YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | TIMEZONE_HOUR | TIMEZONE_MINUTE | TIMEZONE_REGION | TIMEZONE_ABBR } FROM { expr } ) 按參數提取日期中的某部分 |
|
extract(timestamp, string unit) extract(unit FROM timestamp) 比Oracle多一種格式 |
FROM_TZ |
將時間戳和時區合併爲帶時區的時間戳 |
|
|
FROM_UNIXTIME |
|
將unix紀元以來的秒數轉化爲時間字符串 |
同hive |
FROM_UTC_TIMESTAMP |
|
將UTC的時間戳值轉化爲指定時區的時間戳值 |
同hive |
HOUR |
|
返回時間字符串的小時值 |
同hive |
HOURS_ADD / HOURS_SUB |
|
|
在某日期上加/減n個小時 |
LAST_DAY |
返回該日期所在月份的最後一天 |
同Oracle,1.1.0之後 |
|
LOCALTIMESTAMP |
返回當前時間(和session的時區相關),精確到毫秒,返回類型爲TIMESTAMP |
|
|
MICROSECONDS_ADD / MICROSECONDS_SUB |
|
|
在某日期上加/減n微秒 |
MILLISECONDS_ADD / MILLISECONDS_SUB |
|
|
在某日期上加/減n毫秒 |
MINUTE |
|
返回時間字符串的分鐘值 |
|
MINUTES_ADD / MINUTES_SUB |
|
|
在某日期上加/減n分鐘 |
MONTH |
|
返回時間字符串的月份 |
同hive |
MONTHS_ADD / MONTHS_SUB |
|
|
在某日期上加/減n個月(其實第一個和ADD_MONTHS重複) |
MONTHS_BETWEEN |
返回兩個日期間相差的月數,注意返回值是個浮點數 |
同Oracle,1.2.0後 |
|
NANOSECONDS_ADD / NANOSECONDS_SUB |
|
|
在某日期上加/減n納秒(impala搞這麼多沒用的加減函數真不知道幹什麼) |
NEW_TIME |
將時區1的時間轉換爲時區2的時間 |
|
|
NEXT_DAY |
返回指定日期後下一個星期幾的日期 |
同Oracle,1.2.0後 |
|
NUMTODSINTERVAL / NUMTOYMINTERVAL |
生成n時間單位的一個日期間隔。前一函數的間隔可選DAY,HOUR,MINUTE,SECOND,後一個的間隔可選MONTH,YEAR |
|
|
QUATER |
|
返回日期的季度值(1-4),1.3.0後 |
|
ROUND |
對日期作舍入 |
|
|
SECOND |
|
返回時間字符串的秒值 |
同hive |
SECOND_ADD / SECOND_SUB |
|
|
在某日期上加/減n秒 |
SESSIONTIMEZONE |
返回session的時區 |
|
|
SYS_EXTRACT_UTC |
從日期字符串中抽取UTC日期 |
|
|
SYSDATE / SYSTIMESTAMP |
返回操做系統日期,前者到秒,後者到微秒 |
|
|
TO_CHAR |
將date或timestamp類型轉換爲varchar2,經常使用 |
|
|
TO_DATE |
|
返回時間戳的日期部分 |
同hive |
TO_DSINTERVAL / TO_YMINTERVAL |
將一個字符串轉換爲INTERVAL DAY TO SECOND / INTERVAL YEAR TO MONTH類型的時間間隔 |
|
|
TO_TIMESTAMP / TO_TIMESTAMP_TZ |
將一個字符串轉換爲時間戳,前一個不帶時區,後一個帶時區 |
|
|
TO_UTC_TIMESTAMP |
|
將帶時區的時間戳轉換爲UTC的 |
同hive |
TRUNC |
對日期作舍,語法相似ROUND,支持舍入到年、季度、月、周、日、小時、分鐘等精度 |
1.2.0後有,只支持舍入到年、月 |
同oracle |
TZ_OFFSET |
返回某個時區和UTC間的誤差值 |
|
|
UNIX_TIMESTAMP |
|
返回秒爲單位的時間戳數值,無參數時爲當前時間,一個參數時須要傳入yyyy-MM-dd HH:mm:ss格式的時間字符串,兩個參數時能夠自定義傳入時間格式 |
同hive |
WEEKOFYEAR |
|
返回該日期所在的周是年中第幾周 |
|
WEEKS_ADD / WEEKS_SUB |
|
|
在某日期上加/減n周 |
YEAR |
|
返回該日期的年份 |
同hive |
YEARS_ADD / YEARS_SUB |
|
|
在某日期上加/減n年 |
5.4 轉換函數
功能 |
Oracle |
Hive |
Impala |
CAST |
CAST({ expr | MULTISET (subquery) } AS type_name) 輸入能夠是表達式也能夠是集合 |
cast(expr as <type>) 將表達式轉換爲指定類型 |
同hive |
BINARY |
|
將參數轉換爲binary類型 |
|
其他各類*TO* / TO_* |
都是Oracle特有的轉換函數,建議看官方手冊 |
|
|
5.5 條件函數
功能 |
Oracle |
Hive |
Impala |
CASE … WHEN |
|
1,CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END When a = b, returns c; when a = d, returns e; else returns f.
2,CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END When a = true, returns b; when c = true, returns d; else returns e. |
同hive (注:由於在Oracle中如case...when是表達式,而hive和impala中這些是用函數來處理的,雖然提供了與Oracle類似的語法,但語言層面實現機制不一樣) |
COALESCE |
接收多個值,返回這些值中第一個非NULL的,若是全是NULL則返回NULL |
同oracle |
同oracle |
DECODE |
DECODE(expr, search, result [, search, result ]... [, default ]) 對expr,若是知足第一個search則返回第一個result,若是知足第二個search則返回第二個result |
|
同oracle |
IF |
|
if(boolean testCondition, T valueTrue, T valueFalseOrNull) testCondition若是真則返回valueTrue,若是假或NULL則返回valueFalseOrNull |
同hive |
ISNULL |
|
isnull(a) 若是a爲NULL返回true,不然返回false |
isnull(type a, type ifNotNull) 若是a非NULL則返回a,不然返回ifNotNull。 注意和hive有重大區別,另該函數有別名IFNULL和NVL |
ISNOTNULL |
|
和ISNULL相反 |
|
LNNVL |
LNNVL(condition) 若是condition爲false或unknown返回true,若是爲true返回false |
|
|
NANVL |
NANVL(n2, n1) 若是n2是NaN返回n1,不然返回n2 |
|
|
NULLIF |
NULLIF(expr1, expr2) 等價與CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END |
|
同oracle |
NULLIFZERO |
|
|
nullifzero(numeric_expr) 若是numeric_expr爲0返回NULL,不然返回該表達式的值 |
NVL |
NVL(expr1, expr2) 若是expr1爲NULL則返回expr2,不然返回expr1 |
同oracle |
同oracle |
NVL2 |
NVL2(expr1, expr2, expr3) 若是expr1非NULL則返回expr2,若是爲NULL則返回expr3 |
|
|
ZEROIFNULL |
|
|
zeroifnull(numeric_expr) 若是numeric_expr爲NULL返回0,不然返回該表達式的值 |
5.6 聚合函數
以上5類函數都是對單行操做的,接下去的兩類:聚合函數和分析函數,則是跨行操做的。
功能 |
Oracle |
Hive |
Impala |
APPX_MEDIAN |
|
|
APPX_MEDIAN([DISTINCT | ALL] expression) 以抽樣的方式,計算某列大體的中位數值 |
AVG |
AVG([ DISTINCT | ALL ] expr) [ OVER(analytic_clause) ] OVER後可帶分析函數子句 |
同oracle |
同oracle |
COLLECT |
COLLECT( [ DISTINCT | UNIQUE ] column [ ORDER BY expr ] ) 該語句匯聚某列的值構造一張內嵌表 |
|
|
COLLECT_SET / COLLECT_LIST |
|
將一組對象組成一個array,其中帶SET的函數會去重,帶LIST的函數不去重 |
|
CORR |
CORR(expr1, expr2) [ OVER (analytic_clause) ] 計算兩列的皮爾遜相關係數,OVER後可帶分析函數子句 還有兩個變種CORR_S和CORR_K |
沒有OVER子句,也沒有變種 |
|
COUNT |
COUNT({ * | [ DISTINCT | ALL ] expr }) [ OVER (analytic_clause) ] OVER後可帶分析函數子句 |
同oracle |
同oracle |
COVAR_POP |
COVAR_POP(expr1, expr2) [ OVER (analytic_clause) ] 計算整體協方差,OVER後可帶分析函數子句 |
沒有OVER子句 |
|
COVAR_SAMP |
COVAR_SAMP(expr1, expr2) [ OVER (analytic_clause) ] 計算樣本協方差,OVER後可帶分析函數子句 |
沒有OVER子句 |
|
CUME_DIST |
計算一組數據的累積分佈,有聚合和分析兩種用法,詳見官方手冊 |
|
|
DENSE_RANK |
DENSE_RANK(expr [, expr ]...) WITHIN GROUP (ORDER BY expr [ DESC | ASC ] [ NULLS { FIRST | LAST } ] [,expr [ DESC | ASC ] [ NULLS { FIRST | LAST } ] ]... ) 和RANK的區別是,有並列值時下一位會繼續編號,如兩個值並列第1,下一個值排第2 |
|
|
FIRST / LAST |
某數據集進行排序後,可對第一條/最後一條記錄進行處理,詳見官方手冊 |
|
|
GROUP_ID |
用於消除GROUP BY子句返回的重複記錄 |
|
|
GROUPING |
用於區分是數據庫中原本的值仍是匯聚後的值 |
|
|
GROUPING_ID |
輸入一列或多列,返回GROUPING位向量的十進制值 |
|
|
GROUP_CONCAT |
|
|
將一列的值組合爲一個string |
HISTOGRAM_NUMERIC |
|
計算數值列的直方圖 |
|
LISTAGG |
將一列的值組合爲一個string,可指定分組、排序等參數 |
|
|
MAX / MIN |
MAX([ DISTINCT | ALL ] expr) [ OVER (analytic_clause) ] OVER後可帶分析函數子句 |
同oracle |
同oracle |
MEDIAN |
MEDIAN(expr) [ OVER (query_partition_clause) ] 中位數,OVER後可帶分析函數子句 |
|
|
NDV |
|
|
相似count(distinct ),但給出的是估算值,計算速度快 |
NTILE |
|
將分區分到x個組上,每一個給一個編號,配合PERCENTILE等使用 |
|
PERCENT_RANK |
相似CUME_DIST,計算一組數的百分位分佈,有聚合和分析兩種用法,詳見官方手冊 |
|
|
PERCENTILE_COUNT / PERCENTILE_DIST |
接受一個分位值,返回知足該分位值的插值後數值/集合中原始值,詳見官方手冊 |
|
|
PERCENTILE |
|
只接受整型,計算p百分位數的值 |
|
PERCENTILE_APPROX |
|
接受double型,計算p百分位數的值 |
|
RANK |
RANK(expr [, expr ]...) WITHIN GROUP (ORDER BY expr [ DESC | ASC ] [ NULLS { FIRST | LAST } ] [, expr [ DESC | ASC ] [ NULLS { FIRST | LAST } ] ]... ) 計算排位值,有聚合和分析兩種用法,這裏的語法是聚合,重要,詳見官方手冊 |
|
|
REGR_* |
一堆線性迴歸函數,不重要 |
|
|
STAT_* |
一堆統計函數,不重要 |
|
|
STDDEV / STDDEV_POP / STDDEV_SAMP |
計算樣本標準差、整體標準差、累積樣本標準差,OVER後可帶分析函數子句 |
沒有STDEV函數,沒有OVER子句 |
沒有OVER子句 |
SUM |
SUM([ DISTINCT | ALL ] expr) [ OVER (analytic_clause) ] OVER後可帶分析函數子句 |
同oracle |
同oracle |
SYS_XMLAGG / XMLAGG |
將一列的值組合爲一個xml,其中SYS_XMLAGG課指定xml格式,XMLAGG可指定值排序方式 |
|
|
VAR_POP / VAR_SAMP / VARIANCE |
計算樣本方差、整體方差、累積樣本方差,OVER後可帶分析函數子句 |
沒有OVER子句,且VAR_POP和VARIANCE功能同樣 |
同oracle 其中VAR_POP / VAR_SAMP也可寫爲VARIANCE_POP / VARIANCE_SAMP |
5.7 分析(開窗)函數
分析(開窗)函數中,有一部分是和聚合函數同名的,只要能夠帶OVER子句的均可做爲分析(開窗)函數使用,這部分再也不重複列舉。
此外在列舉函數前,須要對比一下三者的OVER子句和window子句的不一樣寫法(主要差異就在於window子句):
OVER子句:
Oracle:[ query_partition_clause ] [order_by_clause [ windowing_clause ] ]
Hive:沒找到細節定義,目測和Oracle一致
Impala:和Oracle一致
query_partition_clause:
Oracle:PARTITION BY { expr[, expr ]...| (expr[, expr ]... ) }
Hive:沒找到細節定義,目測和Oracle一致
Impala:沒找到細節定義,目測和Oracle一致
order_by_clause:
Oracle:ORDER [ SIBLINGS ] BY { expr | position| c_alias } [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ] [, { expr | position | c_alias } [ ASC | DESC] [ NULLS FIRST | NULLS LAST ] ]...
Hive:沒找到細節定義,目測和Oracle一致
Impala:沒找到細節定義,目測和Oracle一致
windowing_clause:
Oracle:{ ROWS | RANGE } { BETWEEN { UNBOUNDED PRECEDING | CURRENT ROW | value_expr { PRECEDING | FOLLOWING } } AND { UNBOUNDED FOLLOWING | CURRENT ROW | value_expr { PRECEDING | FOLLOWING } } | { UNBOUNDED PRECEDING | CURRENT ROW | value_expr PRECEDING } }
Hive:ROWS ((CURRENT ROW) | (UNBOUNDED |[num]) PRECEDING) AND (UNBOUNDED | [num]) FOLLOWING
Impala:{ ROWS | RANGE } BETWEEN [ { m |UNBOUNDED } PRECEDING | CURRENT ROW] [ AND [CURRENT ROW | { UNBOUNDED | n }FOLLOWING] ]
功能 |
Oracle |
Hive |
Impala |
CUME_DIST |
有聚合和分析兩種用法(上面已列) |
有分析用法 |
|
DENSE_RANK |
DENSE_RANK( ) OVER([ query_partition_clause ] order_by_clause) 這裏的用法是分析 |
同oracle |
同oracle(hive和impala只有分析用法沒有聚合用法,故單列) |
FIRST_VALUE / LAST_VALUE |
FIRST_VALUE { (expr) [ {RESPECT | IGNORE} NULLS ] | (expr [ {RESPECT | IGNORE} NULLS ]) } OVER (analytic_clause) 返回某個排序集合的第一個/最後一個值 |
FIRST_VALUE(expr) OVER([partition_by_clause] order_by_clause [window_clause]) 和oracle相比略簡化 |
同hive |
LAG |
LAG { ( value_expr [, offset [, default]]) [ { RESPECT | IGNORE } NULLS ] | ( value_expr [ { RESPECT | IGNORE } NULLS ] [, offset [, default]] ) } OVER ([ query_partition_clause ] order_by_clause) 提供了一種同時訪問表的多行的方式,即對訪問的某行往前推offset行,避免了自鏈接,參考官方手冊中取員工的本月和上月工資的例子 |
LAG (expr [, offset] [, default]) OVER ([partition_by_clause] order_by_clause) 和oracle相比略簡化 |
同hive |
LEAD |
LEAD { ( value_expr [, offset [, default]] ) [ { RESPECT | IGNORE } NULLS ] | ( value_expr [ { RESPECT | IGNORE } NULLS ] [, offset [, default]] ) } OVER ([ query_partition_clause ] order_by_clause) 相似LAG,不一樣之處是日後推而不是往前推 |
LEAD (expr [, offset] [, default]) OVER ([partition_by_clause] order_by_clause) 和oracle相比略簡化 |
同hive |
PERCENT_RANK |
有聚合和分析兩種用法(上面已列) |
有分析用法 |
|
RANK |
RANK( ) OVER ([ query_partition_clause ] order_by_clause) 計算排位值,這裏的用法是分析,有並列值時,下一位會跳開並列的個數再編號,如兩個值並列第1,下一個值排第3。重要且經常使用 |
同oracle |
同oracle(hive和impala只有分析用法沒有聚合用法,故單列) |
ROW_NUMBER |
ROW_NUMBER( ) OVER ([ query_partition_clause ] order_by_clause) 編行號,重要且經常使用 |
同oracle |
同oracle |
5.8 其餘
剩下就是些各庫特有的東西了,不經常使用,看看官方手冊就好。