Oracle 10gR2分析函數

Oracle 10gR2分析函數彙總html

 




(Translated By caizhuoyi 2008‐9‐19)


說明: ios


一、 wps27E6.tmp原文中底色爲黃的部分翻譯存在商榷之處,請你們踊躍提意見;  面試

二、 原文中淡藍色字體的文字,不宜翻譯,保持原樣。  數據庫

1. ANALYTIC FUNCTIONS

Analytic functions compute an aggregate value based on a group of rows. They differ from aggregate functions in that they return multiple rows for each group. The group of rows is called a window and is defined by the analytic_clause. For each row, a sliding window of rows is defined. The window determines the range of rows used to perform the calculations for the current row. Window sizes can be based on either a physical number of rows or a logical interval such as time. express

分析函數經過將行分組後,再計算這些分組的值。它們與彙集函數不一樣之處在於可以對每一分組返回多行值。分析函數根據analytic_claues(分析子句)將行分組,一個分組稱爲一個窗口。每一行都對應有一個在行上滑動的窗口。該窗口肯定當前行的計算範圍。窗口大小能夠用多個物理行進行度量,也可使用邏輯區間進行度量,好比時間。  windows

Analytic functions are the last set of operations performed in a query except for the final ORDER BY clause. All joins and all WHERE, GROUP BY, and HAVING clauses are completed before the analytic functions are processed. Therefore, analytic functions can appear only in the select list or ORDER BY clause. 微信

分析函數是查詢中除須要在最終處理的order by子句以外最後執行的操做。全部鏈接和全部wheregroup by,和having子句都要在處理分析函數以前進行計算。所以,分析函數只能用於選擇列或order by子句中。  網絡

cumulative, moving, centered, and oracle

Analytic functions are commonly used to compute app

reporting aggregates.

分析函數一般用於計算數據累積值,數據移動值、數據中間值,和輸出集合報表。 

 

analytic_function::= 

wps27E7.tmp 

 

analytic_function([ arguments ])

   OVER (analytic_clause)

 

analytic_clause::= 

wps27E8.tmp 

 

[ query_partition_clause ]

[ order_by_clause [ windowing_clause ] ]

 

query_partition_clause::=

wps27F9.tmp 

 

PARTITION BY

  { value_expr[, value_expr ]...

  | ( value_expr[, value_expr ]... )

  }   

order_by_clause::=

wps27FA.tmp 

 

ORDER [ SIBLINGS ] BY

{ expr | position | c_alias }

[ ASC | DESC ]

[ NULLS FIRST | NULLS LAST ]

  [, { expr | position | c_alias }

     [ ASC | DESC ]

     [ NULLS FIRST | NULLS LAST ]   ]...  windowing_clause ::=

wps27FB.tmp 

 

{ 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

  } }

The semantics of this syntax are discussed in the sections that follow.

如下各節將討論分析函數語法的語義。

1.1 analytic_function

Specify the name of an analytic function (see the listing of analytic functions following this discussion of semantics).

Analytic_function指定分析函數的名稱。(請參閱如下語義論述中的分析函數列表)

1.2 Arguments

Analytic functions take 0 to 3 arguments. The arguments can be any numeric datatype or

any nonnumeric datatype that can be implicitly converted to a numeric datatype. Oracle

est numeric precedence

determines the argument with the high and implicitly converts the

remaining arguments to that datatype. The return type is also that datatype, unless

otherwise noted for an individual function. 分析函數可取0-3個參數。參數能夠是任何數字類型或是能夠隱式轉換爲數字類型的數據類型。Oracle根據最高數字優先級別肯定函數參數,而且隱式地將須要處理的參數轉換爲數字類型。函數的返回類型也爲數字類型,除非此函數另有說明。 

 

See Also:

"Numeric Precedence" for information on numeric precedence and Table 2-10, "Implicit Type Conversion Matrix" for more information on implicit conversion 

 

請參閱: 

"Numeric Precedence"可獲取數字優先級的相關信息,參閱表2-10—-隱式類型轉換矩陣,可獲取隱式轉換的更多信息。 

1.3 analytic_clause

Use OVER analytic_clause to indicate that the function operates on a query result set. That is, it is computed after the FROM, WHERE, GROUP BY, and HAVING clauses. You can specify analytic functions with this clause in the select list or ORDER BY clause. To filter the results of a query based on an analytic function, nest these functions within the parent query, and then filter the results of the nested subquery.

 

Over Analytic_clause用以指明函數操做的是一個查詢結果集。也就是說分析函數是在 from,where,group by,having子句以後纔開始進行計算的。所以在選擇列或order by子句中可使用分析函數。爲了過濾分析函數計算的查詢結果,能夠將它做爲子查詢嵌套在外部查詢中,而後在外部查詢中過濾其查詢結果。 

 

Notes on the analytic_clause: The following notes apply to the analytic_clause:

 

Analytic_clause注意事項:使用分析子句注意事項以下: 

? You cannot specify any analytic function in any part of the analytic_clause. That is, you cannot nest analytic functions. However, you can specify an analytic function in a subquery and compute another analytic function over it.

Analytic_clause中不能包含其餘任何分析函數。也就是說,分析函數不能嵌套。然而,能夠在一個子查詢中應用分析函數,而且經過它計算另外的分析函數。 

? You can specify OVER analytic_clause with user-defined analytic functions as well as built-in analytic functions. See CREATE FUNCTION.

用戶自定義分析函數和內置函數分析函數均可以使用over analytic_clause。參見create function 

1.4 query_partition_clause

Use the PARTITION BY clause to partition the query result set into groups based on one or more value_expr. If you omit this clause, then the function treats all rows of the query result set as a single group.

Partition by子句根據一個或多個value_expr將查詢結果集分紅若干組。若不使用該子句,那末函數將查詢結果集的全部行看成一個組。 

 

To use the query_partition_clause in an analytic function, use the upper branch of

the syntax (without parentheses). To use this clause in a model query (in the model_column_clauses) or a partitioned outer join (in the outer_join_clause), use the lower branch of the syntax (with parentheses).

 

在分析函數中使用query_partition_clause,應該使用語法圖中上分支中的語法(不帶圓括號).model查詢(位於model_column_clauses)或被分隔的外部鏈接(位於 outer_join_clause)中使用該子句,應該使用語法圖中下分支中的語法(帶有圓括號) 

 

You can specify multiple analytic functions in the same query, each with the same or different PARTITION BY keys.

 

在同一查詢中可使用多個分析函數,它們能夠有相同或不一樣的partition by鍵值。 

 

If the objects being queried have the parallel attribute, and if you specify an analytic function with the query_partition_clause, then the function computations are parallelized as well.

 

若被查詢的對象具備並行特性,而且分析函數中包含query_partition_clause,那末函數的計算也是並行的。 

 

Valid values of value_expr are constants, columns, nonanalytic functions, function expressions, or expressions involving any of these.

 

value_expr的有效值包括常量,表列,非分析函數,函數表達式,或者前面這些元素的任意組合表達式。 

1.5 order_by_clause 

Use the order_by_clause to specify how data is ordered within a partition. For all analytic functions except PERCENTILE_CONT and PERCENTILE_DISC (which take

only a single key), you can order the values in a partition on multiple keys, each defined by a value_expr and each qualified by an ordering sequence. 

 

Order_by_clause用以指定分組中數據的排序形式。除PERCENTILE_CONTPERCENTILE_DISC以外(它們只能取惟一的鍵值)外的分析函數,分組中可使用多個鍵值對值進行排序,每一個鍵值在value_expr中定義,而且被排序序列限定。 

 

Within each function, you can specify multiple ordering expressions. Doing so is especially useful when using functions that rank values, because the second expression can resolve ties between identical values for the first expression.

 

每一個函數內能夠指定多個排序表達式。當使用函數給值排名時,尤爲顯得意義非凡,由於第二個表達式可以解決按照第一個表達式排序後仍然存在相同排名的問題。 

 

Whenever the order_by_clause results in identical values for multiple rows, the function returns the same result for each of those rows. Please refer to the analytic example for SUM for an illustration of this behavior.

 

只要使用order_by_clause後,仍存在值相同的行,則每一行都會返回相同的結果。相關行爲的例子請參閱考sum分析函數的例子。 

 

Restrictions on the ORDER BY Clause The following restrictions apply to the ORDER BY clause:

 

Order by子句的限制:下面是使用order by子句的一些限制: 

? When used in an analytic function, the order_by_clause must take an expression (expr). The SIBLINGS keyword is not valid (it is relevant only in hierarchical queries). Position (position) and column aliases (c_alias) are also invalid. Otherwise this order_by_clause is the same as that used to order the overall query or subquery.

分析函數中的order_by_clause必須是一個表達式(expr)Sibling關鍵字在此處是非法的(它僅僅與層次查詢有關)。位置(position)和列別名(c_alias)也是非法的。除此以外,order_by_clause的用法與整個查詢或子查詢中的相同。 

? An analytic function that uses the RANGE keyword can use multiple sort keys in its ORDER BY clause if it specifies either of these two windows:

當分析函數使用range關鍵字限定窗口時,若使用的窗口是下列兩個窗口之一,那末能夠在分析函數的order by子句中使用多個排序鍵值。 

 

o RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. The short form of this is RANGE UNBOUNDED PRECEDING. RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

簡寫成 range unbounded preceding

o RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING. The short form of this is RANGE UNBOUNDED FOLLOWING. RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING.

簡寫成:range unbounded following

 

Window boundaries other than these two can have only one sort key in the ORDER BY clause of the analytic function. This restriction does not apply to window boundaries specified by the ROW keyword.

 

若窗口範圍由range關鍵字指定的分析函數中指定的不是這兩個窗口範圍,那末order by 子句中僅能使用一個排序鍵值。若分析函數的窗口範圍由row關鍵字指定,order by子句中排序鍵值的使用沒有這個限制。 

 

ASC | DESC Specify the ordering sequence (ascending or descending). ASC is the default.

 

asc | desc 指定排序順序(升序或降序)asc是默認值。 

 

NULLS FIRST | NULLS LAST  Specify whether returned rows containing nulls should appear first or last in the ordering sequence.

 

nulls first | nulls last 指定若返回行包含空值,該值應該出如今排序序列的開始仍是末尾。 

 

NULLS LAST is the default for ascending order, and NULLS FIRST is the default for descending order.

 

升序排序的默認值是nulls last,降序排序的默認值是nulls first 

 

Analytic functions always operate on rows in the order specified in the order_by_clause of the function. However, the order_by_clause of the function does not guarantee the order of the result. Use the order_by_clause of the query to guarantee the final result ordering.

分析函數老是按order_by_clause對行排序。然而,分析函數中的order_by_clause

只對各個分組進行排序,而不能保證查詢結果有序。要保證最後的查詢結果有序,可使用查詢的order_by_clause 

See Also:

order_by_clause of SELECT for more information on this clause

 

請參閱: select中的order_by_clause獲取該子句的更多信息。 

1.6 windowing_clause

Some analytic functions allow the windowing_clause. In the listing of analytic functions at the end of this section, the functions that allow the windowing_clause are followed by an asterisk (*).

 

有些分析函數容許使用windowing_clause。在此節末尾的分析函數列表中,帶有星號(*) 的函數都容許使用windowing_clause 

ROWS | RANGE These keywords define for each row a window (a physical or logical set of rows) used for calculating the function result. The function is then applied to all the rows in the window. The window moves through the query result set or partition from top to bottom.

row | range 這些關鍵字爲每一行定義一個窗口,該窗口用於計算函數結果(物理或邏輯的行的集合).而後對窗口中的每一行應用分析函數。窗口在查詢結果集或分組中從上至下移動。 

? ROWS specifies the window in physical units (rows).

rows 指定窗口以物理單位()構成。 

? RANGE specifies the window as a logical offset.

range 指定窗口以邏輯偏移量構成。 

 

You cannot specify this clause unless you have specified the order_by_clause. Some window boundaries defined by the RANGE clause let you specify only one expression in the order_by_clause. Please refer to "Restrictions on the ORDER BY Clause".

 

只有指定order_by_clause後才能指定windowing_clause。有些range子句定義的窗口範圍只能在order_by_clause中指定一個排序表達式。請參閱Restrictions on order by Clause 

 

The value returned by an analytic function with a logical offset is always deterministic. However, the value returned by an analytic function with a physical offset may produce nondeterministic results unless the ordering expression results in a unique ordering. You may have to specify multiple columns in the order_by_clause to achieve this unique ordering. 一個帶邏輯偏移量的分析函數的返回值老是肯定的。然而,除非排序表達式能產生惟一的排序,不然帶有物理偏移量的分析函數的返回值可能會產生不肯定的結果。爲了解決此問題,你可能不得不在order_by_clause中指定多個列以得到惟一的排序。 

 

BETWEEN ... AND Use the BETWEEN ... AND clause to specify a start point and end point for the window. The first expression (before AND) defines the start point and the second expression (after AND) defines the end point.

 

between ... and  between … and子句用來指定窗口的起點和終點。第一個表達式(位於and以前)定義起點,第二個表達式(位於and以後)定義終點。 

 

If you omit BETWEEN and specify only one end point, then Oracle considers it the start point, and the end point defaults to the current row.

 

若不使用between而僅指定一個終點,那末oracle認爲它是起點,終點默認爲當前行。 

UNBOUNDED PRECEDING Specify UNBOUNDED PRECEDING to indicate that the window

starts at the first row of the partition. This is the start point specification and cannot be used as an end point specification.

unbounded preceding 指定unbounded preceding 指明窗口開始於分組的第一行。它只用於指定起點而不能用於指定終點。 

 

UNBOUNDED FOLLOWING Specify UNBOUNDED FOLLOWING to indicate that the

window ends at the last row of the partition. This is the end point specification and cannot be used as a start point specification.

unbounded following 指定unbounded following 指明窗口結束於分組的最後一行。它只用於指定終點而不能用於指定起點。 

 

CURRENT ROW As a start point, CURRENT ROW specifies that the window begins at the current row or value (depending on whether you have specified ROW or RANGE, respectively). In this case the end point cannot be value_expr PRECEDING.

 

current row 用做起點,current row 指定窗口開始於當前行或當前值(依賴因而否分別指定row range)。在這種狀況下終點不能爲value_expr preceding 

 

As an end point, CURRENT ROW specifies that the window ends at the current row or value (depending on whether you have specified ROW or RANGE, respectively). In this case the start point cannot be value_expr FOLLOWING.

 

用做終點,current row 指定窗口結束於當前行或當前值(依賴因而否分別指定row range)。在這種狀況下起點不能爲value_expr following 

 value_expr PRECEDING or value_expr FOLLOWING For RANGE or ROW:

 

rangerow中的value_expr preceding value_expr following 

 

? If value_expr FOLLOWING is the start point, then the end point must be value_expr FOLLOWING.

value_expr FOLLOWING是起點,那末終點必須是value_expr FOLLOWING 

? If value_expr PRECEDING is the end point, then the start point must be value_expr PRECEDING.

value_expr PRECEDING是終點,那末起點必須是value_expr PRECEDING 

 

If you are defining a logical window defined by an interval of time in numeric format, then you may need to use conversion functions.

 

若要定義一個數字格式的時間間隔的邏輯窗口,那末可能須要用到轉換函數。 

 

See Also:

NUMTOYMINTERVAL and NUMTODSINTERVAL for information on converting numeric times into intervals 

 

請參閱: 

NUMTOMINTERVALNUMTODSINTERVAL獲取關於數次轉換爲時間間隔的信息。 

 

If you specified ROWS:

 

windowing_clauserows指定: 

? value_expr is a physical offset. It must be a constant or expression and must evaluate to a positive numeric value.

value_expr是一個物理偏移量,它必須是一個常量或表達式,而且表達式的值必須爲正數值。 

? If value_expr is part of the start point, then it must evaluate to a row before the end point.

value_expr是起點的一部分,那末它必須在終點以前對行求值。 

 

If you specified RANGE:

 

windowing_clauserange指定: 

? value_expr is a logical offset. It must be a constant or expression that evaluates to a positive numeric value or an interval literal. Please refer to "Literals" for information on interval literals.

value_expr是一個邏輯偏移量。它必須是常量,或值爲正數值的表達式,或時間間隔文字常量。請參閱Literals獲取有關時間間隔文字常量的信息。 

? You can specify only one expression in the order_by_clause 

只能在order_by_clause中指定一個表達式。 

? If value_expr evaluates to a numeric value, then the ORDER BY expr must be a numeric or DATE datatype.

value_expr求值爲一個數字值,那末order by expr必須爲數字或date 類型。 

? If value_expr evaluates to an interval value, then the ORDER BY expr must be a DATE datatype.

value_expr求值爲一個間隔值,那末order by expr必須是一個date類型。 

 

If you omit the windowing_clause entirely, then the default is RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

 

若徹底忽略windowing_clause,那末默認值爲 range between unbounded preceding and current row  

 

Analytic functions are commonly used in data warehousing environments. In the list of analytic functions that follows, functions followed by an asterisk (*) allow the full syntax, including the windowing_clause.

分析函數一般用於數據倉庫環境中。下面是分析函數列表,帶有星號的函數能夠包含windowing_clause 

 

AVG *

CORR *

COVAR_POP *

COVAR_SAMP *

COUNT *

CUME_DIST 

wps280C.tmpDENSE_RANK 

FIRST 

FIRST_VALUE *

LAG 

LAST 

wps280D.tmpLAST_VALUE *

LEAD 

wps280E.tmpMAX * MIN *

NTILE 

PERCENT_RANK 

wps281E.tmpPERCENTILE_CONT 

PERCENTILE_DISC 

RANK 

RATIO_TO_REPORT 

wps281F.tmpREGR_ (Linear Regression) Functions *

ROW_NUMBER 

STDDEV *

STDDEV_POP *

STDDEV_SAMP *

SUM *

wps2820.tmpVAR_POP *

VAR_SAMP *

wps2831.tmpVARIANCE

 

See Also:

Oracle Data Warehousing Guide for more information on these functions and for

scenarios illustrating their use

 

請參閱: 

Oracle Data Warehousing Guide獲取關於這些函數及其方案使用說明的更多信息。 

2. AVG 

2.1 Syntax

wps2832.tmp 

 

AVG([ DISTINCT | ALL ] expr)

  [ OVER(analytic_clause) ]

 

See Also:

"Analytic Functions" for information on syntax, semantics, and restrictions

 

2.2 Purpose 

AVG returns average value of expr.

Avg函數返回expr的平均值。 

This function takes as an argument any numeric datatype or any nonnumeric datatype that can be implicitly converted to a numeric datatype. The function returns the same datatype as the numeric datatype of the argument.

函數參數可取任何數字類型或任何能夠隱式轉換爲數字類型的非數字類型。函數返回類型與參數類型相同,都爲數字類型。 

 

See Also:

Table 2-10, "Implicit Type Conversion Matrix" for more information on implicit conversion

 

If you specify DISTINCT, then you can specify only the query_partition_clause of the analytic_clause. The order_by_clause and windowing_clause are not allowed.

Distinct關鍵字僅能在analytic_clausequery_partition_clause中使用。在 order_by_clausewindowing_clause中不容許使用distinct 

 

See Also:

"About SQL Expressions" for information on valid forms of expr and "Aggregate Functions" 

 

2.3 Aggregate Example 

The following example calculates the average salary of all employees in the hr.employees table:

下面的例子計算hr.employees表中全部僱員的平均薪水: 

 

SELECT AVG(salary) "Average" FROM employees; 

 

AVERAGE

--------

    6425

2.4 Analytic Example 

The following example calculates, for each employee in the employees table, the average salary of the employees reporting to the same manager who were hired in the range just before through just after the employee:

下面的例子計算,employees表中相同經理下的每一僱員和僱傭日期正好位於該僱員正先後的僱員的平均薪水: 

 

SELECT manager_id,        last_name,        hire_date,        salary,

       AVG(salary) over(PARTITION BY manager_id ORDER BY hire_date rows 

BETWEEN 1 preceding AND 1 following) AS c_mavg

  FROM employees;

 

MANAGER_ID LAST_NAME                HIRE_DATE     SALARY     C_MAVG

---------- ------------------------- --------- ---------- ----------

       100 Kochhar                   21-SEP-89      17000      17000 

       100 De Haan                   13-JAN-93      17000      15000

       100 Raphaely                  07-DEC-94      11000 11966.6667

       100 Kaufling                  01-MAY-95       7900 10633.3333

       100 Hartstein                 17-FEB-96      13000 9633.33333

       100 Weiss                     18-JUL-96       8000 11666.6667

       100 Russell                   01-OCT-96      14000 11833.3333 . . .

3. CORR 

3.1 Syntax

wps2833.tmp 

 

CORR(expr1, expr2)

   [ OVER (analytic_clause) ]

 

 

See Also:

"Analytic Functions" for information on syntax, semantics, and restrictions

 

3.2 Purpose 

CORR returns the coefficient of correlation of a set of number pairs. You can use it as an aggregate or analytic function.

Corr返回一組數值對的相關係數。它能夠用做彙集或分析函數。 

This function takes as arguments any numeric datatype or any nonnumeric datatype that can be implicitly converted to a numeric datatype. Oracle determines the argument with the highest numeric precedence, implicitly converts the remaining arguments to that datatype, and returns that datatype.

函數參數可取任何數字類型或任何能夠隱式轉換爲數字類型的非數字類型。Oracle根據最高數字優先級肯定參數,隱式地將須要處理的參數轉換爲數字類型,並返回數字類型。 

 

See Also:

Table 2-10, "Implicit Type Conversion Matrix" for more information on implicit conversion and "Numeric Precedence" for information on numeric precedence

 

Oracle Database applies the function to the set of (expr1, expr2) after eliminating the pairs for which either expr1 or expr2 is null. Then Oracle makes the following computation:

Oracle數據庫使用該函數前先排除(expr1,expr2)集中全部expr1expr2null的數值對。而後做以下的計算: 

 

COVAR_POP(expr1, expr2) / (STDDEV_POP(expr1) * STDDEV_POP(expr2))

 

The function returns a value of type NUMBER. If the function is applied to an empty set, then it returns null. 函數返回一個number類型的值。若函數應用在一個空集上,那末它將返回null 

 

Note:

The CORR function calculates the Pearson's correlation coefficient, which requires numeric expressions as arguments. Oracle also provides the CORR_S (Spearman's rho coefficient) and CORR_K 

(Kendall's tau-b coefficient) to support nonparametric or rank correlation. 

   注意: 

Corr函數計算Pearson關係係數時,須要用數字表達式做爲參數。Oracle也提

 供了corr_s(Spearman's rho係數 和) corr_k(Kendall's tau-b係數)來支  持非參數或排名相關性。 

 

See Also:

"Aggregate Functions", "About SQL Expressions" for information on valid forms of expr, and CORR_* and CORR_S 

 

3.3 Aggregate Example 

The following example calculates the coefficient of correlation between the list prices and minimum prices of products by weight class in the sample table oe.product_information:

下面的列子,計算oe.product_information表中不一樣重量等級產品定價和最低價格之

間的相關係數: 

 

SELECT weight_class, corr(list_price, min_price)

  FROM product_information

 GROUP BY weight_class;

 

WEIGHT_CLASS CORR(LIST_PRICE,MIN_PRICE)

------------ --------------------------            1                  .99914795            2                 .999022941            3                 .998484472            4                 .999359909            5                 .999536087

 

補充:這個查詢與下面的查詢等價:

SELECT weight_class,

       covar_pop(list_price, min_price) /

       (stddev_pop(list_price) * stddev_pop(min_price))

  FROM product_information

 WHERE list_price IS NOT NULL 

   AND min_price IS NOT NULL  GROUP BY weight_class;

3.4 Analytic Example 

The following example shows the correlation between duration at the company and salary by the employee's position. The result set shows the same correlation for each employee in a given job:

下面的例子顯示了不一樣職務的僱員的工齡與薪水之間的相關性。結果代表職務相同的僱員有相同的相關性: 

 

SELECT employee_id,        job_id,

       to_char((SYSDATE - hire_date) YEAR TO MONTH) "Yrs-Mns",        salary,

       corr(SYSDATE - hire_date, salary) over(PARTITION BY job_id) AS 

"Correlation"

  FROM employees

 WHERE department_id IN (50, 80)

 ORDER BY job_id, employee_id;

 

EMPLOYEE_ID JOB_ID     Yrs-Mns     SALARY Correlation ----------- ---------- ------- ---------- -----------         145 SA_MAN     +08-07       14000  .912385598         146 SA_MAN     +08-04       13500  .912385598         147 SA_MAN     +08-02       12000  .912385598         148 SA_MAN     +05-07       11000  .912385598         149 SA_MAN     +05-03       10500  .912385598         150 SA_REP     +08-03       10000   .80436755         151 SA_REP     +08-02        9500   .80436755

152 SA_REP     +07-09        9000   .80436755

153 SA_REP     +07-01        8000   .80436755

154 SA_REP     +06-05        7500   .80436755

155 SA_REP     +05-06        7000   .80436755 ...

4. COVAR_POP 

4.1 Syntax

wps2844.tmp 

 

COVAR_POP(expr1, expr2)

   [ OVER (analytic_clause) ]

 

 

See A "Analy restric

lso:

tic Functions" for information on syntax, semantics, and tions

 

4.2 Purpose 

COVAR_POP returns the population covariance of a set of number pairs. You can use it as an aggregate or analytic function.

Covar_pop返回一組數值對的整體協方差。它能夠用做彙集或分析函數。 

This function takes as arguments any numeric datatype or any nonnumeric datatype that

highest numeric preced

can be implicitly converted to a numeric datatype. Oracle determines the argument with the ence, implicitly converts the remaining arguments to that datatype, and returns that datatype.

函數參數可取任何數字類型或任何能夠隱式轉換爲數字類型的非數字類型。Oracle根據最高數字優先級肯定參數,隱式地將須要處理的參數轉換爲數字類型,並返回數字類型。 

 

See A

Table

implici numer

lso:

2-10, "Implicit Type Conversion Matrix" for more information on t conversion and "Numeric Precedence" for information on

ic precedence

 

Oracle Database applies the function to the set of (expr1, expr2) pairs after eliminating all pairs for which either expr1 or expr2 is null. Then Oracle makes the following computation:

Oracle數據庫使用該函數前先排除(expr1,expr2)集中全部expr1expr2null的數值對。而後做以下的計算: 

 

(SUM(expr1 * expr2) - SUM(expr2) * SUM(expr1) / n) / n

 where n is the number of (expr1, expr2) pairs where neither expr1 nor expr2 is null.

這裏n(expr1,expr2)數值對的個數,expr1expr2都不能爲null 

The function returns a value of type NUMBER. If the function is applied to an empty set, then it returns null.

函數返回一個number類型的值。若將此函數應用在一個空集上,那末它將返回null 

 

See Also:

"About SQL Expressions" for information on valid forms of expr and "Aggregate Functions" 

 

4.3 Aggregate Example 

The following example calculates the population covariance and sample covariance for time employed (SYSDATE - hire_date) and salary using the sample table hr.employees:

下面的例子計算hr.employees表中不一樣職務僱員的僱傭時間和薪水的整體協方差和樣本協方差: 

 

SELECT job_id,

       covar_pop(SYSDATE - hire_date, salary) AS covar_pop,        c ar_samp(ovSYSDATE - hire_date, salary) AS covar_samp

  FROM employees

 WHERE department_id IN (50, 80)

 GROUP BY job_id;

 

JOB_ID       COVAR_POP  COVAR_SAMP ---------- ----------- -----------

ST_MAN      436092.000  545115.000 SH_CLERK    782717.500  823913.158 SA_MAN      660700.000  825875.000 SA_REP      579988.466  600702.340

ST_CLERK    176577.250  185870.789

4.4 Analytic Example 

The following example calculates cumulative sample covariance of the list price and minimum price of the products in the sample schema oe:

下面的例子計算oe模式中不一樣產品的定價和最低價格的累計樣本協方差: 

 

SELECT product_id,        supplier_id,

       covar_pop(list_price, min_price) over(ORDER BY product_id, supplier_id) AS cum_covp,

       covar_samp(list_price, min_price) over(ORDER BY product_id, supplier_id) AS cum_covs   FROM product_information p

 WHERE category_id = 29 

 ORDER BY product_id, supplier_id;

 

PRODUCT_ID SUPPLIER_ID   CUM_COVP   CUM_COVS ---------- ----------- ---------- ---------      1774      103088          0

      1775      103087    1473.25     2946.5       1794      103096 1702.77778 2554.16667       1825      103093    1926.25 2568.33333       2004      103086     1591.4    1989.25

      2005      103086     1512.5       1815       2416      103088 1475.97959 1721.97619 . . .

5. COVAR_SAMP 

5.1 Syntax

wps2845.tmp

 

 COVAR_SAMP(expr1, expr2)

   [ OVER (analytic_clause) ]

 

 

See Also:

"Analytic Functions" for information on syntax, semantics, and restrictions

 

5.2 Purpose 

COVAR_SAMP returns the sample covariance of a set of number pairs. You can use it as an aggregate or analytic function.

Covar_samp返回一組數值對的樣本協方差。它可用做彙集或分析函數。 

This function takes as arguments any numeric datatype or any nonnumeric datatype that can be implicitly converted to a numeric datatype. Oracle determines the argument with the highest numeric precedence, implicitly converts the remaining arguments to that datatype, and returns that datatype.

函數參數可取任何數字類型或任何能夠隱式轉換爲數字類型的非數字類型。Oracle根據最高數字優先級肯定參數,隱式地將須要處理的參數轉換爲數字類型,並返回數字類型。 

 

See Also:

Table 2-10, "Implicit Type Conversion Matrix" for more information on implicit conversion and "Numeric Precedence" for information on numeric precedence

 

Oracle Database applies the function to the set of (expr1, expr2) pairs after eliminating all pairs for which either expr1 or expr2 is null. Then Oracle makes the following computation:

Oracle數據庫使用該函數前先排除(expr1,expr2)集中全部expr1expr2null

數值對。而後做以下的計算: 

 

(SUM(expr1 * expr2) - SUM(expr1) * SUM(expr2) / n) / (n-1)

 where n is the number of (expr1, expr2) pairs where neither expr1 nor expr2 is null.

這裏n(expr1,expr2)數值對的個數,expr1expr2都不能爲null 

The function returns a value of type NUMBER. If the function is applied to an empty set, then it returns null.

函數返回一個number類型的值。若將此函數應用在一個空集上,那末它將返回null 

 

See A "Abou and "A

lso:

t SQL Expressions" for information on valid forms of expr 

ggregate Functions" 

 

5.3 Aggregate Example 

Please refer to the aggregate example for COVAR_POP.

請參閱covar_pop彙集函數例子。 

5.4 Analytic Example 

Please refer to the analytic example for COVAR_POP.

請參閱cova_pop分析函數例子。 

6. COUNT 

6.1 Syntax

wps2846.tmp 

 

COUNT({ * | [ DISTINCT | ALL ] expr })

   [ OVER (analytic_clause) ]

 

 

See A

lso:

"Analytic Functions" for information on syntax, semantics, and restrictions

 

6.2 Purpose 

COUNT returns the number of rows returned by the query. You can use it as an aggregate or analytic function.

Count返回查詢結果集的行數。它能夠用做彙集或分析函數。 

If you specify DISTINCT, then you can specify only the query_partition_clause of the analytic_clause. The order_by_clause and windowing_clause are not allowed.

Distinct關鍵字僅能在analytic_clausequery_partition_clause中使用。在 order_by_clausewindowing_clause中不容許使用distinct 

If you specify expr, then COUNT returns the number of rows where expr is not null. You can count either all rows, or only distinct values of expr.

expr做爲函數參數,那末count不計算exprnull的行。函數要麼計算全部行,要麼僅計算expr的不一樣值。 

If you specify the asterisk (*), then this function returns all rows, including duplicates and nulls. COUNT never returns null.

若星號(*)做爲函數參數,那末函數返回包括數據重複的行和數據爲null的行在內的全部行數。Count毫不返回null 

 

See Also:

"About SQL Expressions" for information on valid forms of expr and "Aggregate Functions" 

 

6.3 Aggregate Examples 

The following examples use COUNT as an aggregate function:

下面是count用做彙集函數的若干例子: 

 

SELECT COUNT(*) "Total" FROM employees;

 

     Total ----------

       107

 

SELECT COUNT(*) "Allstars" FROM employees WHERE commission_pct > 0;

 

Allstars ---------

       35

 

SELECT COUNT(commission_pct) "Count" FROM employees;

 

     Count ----------

        35

 

SELECT COUNT(DISTINCT manager_id) "Managers" FROM employees;

 

  Managers ----------

        18

6.4 Analytic Example 

The following example calculates, for each employee in the employees table, the moving count of employees earning salaries in the range 50 less than through 150 greater than the employee's salary.

下面的例子計算employees表每一個僱員與僱員本身薪水相差在50150之間的僱員的個數。 

 

SELECT last_name,        salary,

       COUNT(*) over(ORDER BY salary RANGE BETWEEN 50 preceding AND 150 following) AS mov_count

  FROM employees;

 

LAST_NAME                     SALARY  MOV_COUNT ------------------------- ---------- ---------- Olson                           2100          3

Markle                          2200          2

Philtanker                      2200          2

Landry                          2400          8

Gee                             2400          8

Colmenares                      2500         10

Patel                           2500         10 . . .

7. CUME_DIST 

7.1 Aggregate Syntax cume_dist_aggregate::=

wps2856.tmp 

 

CUME_DIST(expr[,expr ]...)

   WITHIN GROUP

   (ORDER BY expr [ DESC | ASC ]

                  [ NULLS { FIRST | LAST } ] 

             [, expr [ DESC | ASC ]

                     [ NULLS { FIRST | LAST } ]              ]...

   )

7.2 Analytic Syntax cume_dist_analytic::=

wps2857.tmp

 

CUME_DIST( )

   OVER ([ query_partition_clause ] order_by_clause)

 

 

See Also:

"Analytic Functions" for information on syntax, semantics, and restrictions

 

7.3 Purpose 

CUME_DIST calculates the cumulative distribution of a value in a group of values. The range of values returned by CUME_DIST is >0 to <=1. Tie values always evaluate to the same cumulative distribution value.

Cume_dist計算一個值在一組值中的累計分佈。Cume_dist返回值的範圍爲(0,1]。鏈接值老是對相同的累積值進行求值。 

This function takes as arguments any numeric datatype or any nonnumeric datatype that can be implicitly converted to a numeric datatype. Oracle Database determines the argument with the highest numeric precedence, implicitly converts the remaining arguments to that datatype, makes the calculation, and returns NUMBER.

函數參數可取任何數字類型或任何能夠隱式轉換爲數字類型的非數字類型。Oracle根據最高數字優先級肯定參數,隱式地將須要處理的參數轉換爲數字類型,而後進行計算,並返回 number類型的值。 

 

See Also:

Table 2-10, "Implicit Type Conversion Matrix" for more information on implicit conversion and "Numeric Precedence" for information on numeric precedence

 

? As an aggregate function, CUME_DIST calculates, for a hypothetical row r wps2858.tmpidentified by the arguments of the function and a corresponding sort specification, the relative position of row r among the rows in the aggregation group. Oracle makes this calculation as if the hypothetical row r were inserted into the group of rows to be aggregated over. The arguments of the function identify a single hypothetical row within each aggregate group. Therefore, they must all evaluate to constant expressions within each aggregate group. The constant argument expressions and the expressions in the ORDER BY clause of the aggregate match by position. Therefore, the number of arguments must be the same and their types must be compatible.

CUME_DIST用做彙集函數時,對於一個被函數參數和相應排序規則肯定的假定行rcume_dist計算此假定行r在彙集分組行中的相對位置。Oracle對此進行計算時,就好像假定行r插入了被彙集的行組中同樣。函數參數只肯定彙集分組內的一個假定行。所以,它們必須對每一個彙集分組中的常量表達式所有求值。常量參數表達式和彙集的order by子句中的表達式按位置進行匹配。所以,二者參數個數必須相同,類型必須兼容。 

As an analytic function, CUME_DIST computes the relative position of a specified value in a group of values. For a row r, assuming ascending ordering, the CUME_DIST of r is the number of rows with values lower than or equal to the value of r, divided by the number of rows being evaluated (the entire query result set or a partition).

CUME_DIST用做分析函數時,用於計算一個值在一組值中的相對位置。假定按升序排序的一個結果集或分組中存在一行rcume_dist()r上結果如是求得:值小於等於行r上值的行的行數,除以整個查詢結果集或分組的行數。 

7.4 Aggregate Example 

The following example calculates the cumulative distribution of a hypothetical employee with a salary of $15,500 and commission rate of 5% among the employees in the sample table oe.employees:

下面的例子計算oe.employees表中薪水達到$15500而且佣金率達到5%的假定僱員的累計分佈值: 

SELECT cume_dist(15500, .05) within

 GROUP(

 ORDER BY salary, commission_pct) "Cume-Dist of 15500"

  FROM employees;

 

Cume-Dist of 15500

------------------         .972222222

7.5 Analytic Example 

The following example calculates the salary percentile for each employee in the purchasing division. For example, 40% of clerks have salaries less than or equal to Himuro.

下面的例子計算每一個採購科僱員的薪水百分點。例如,40%的職員的薪水少於或等於Himur 

SELECT job_id,        last_name,        salary,        cume_dist() over(PARTITION BY job_id ORDER BY salary) AS cume_dist

  FROM employees

 WHERE job_id LIKE 'PU%';

 

JOB_ID     LAST_NAME                     SALARY  CUME_DIST

---------- ------------------------- ---------- ----------

PU_CLERK   Colmenares                      2500         .2 PU_CLERK   Himuro                          2600         .4

PU_CLERK   Tobias                          2800         .6

PU_CLERK   Baida                           2900         .8

PU_CLERK   Khoo                            3100          1

PU_MAN     Raphaely                       11000          1

8. DENSE_RANK 

8.1 Aggregate Syntax dense_rank_aggregate::=

wps2869.tmp 

 

DENSE_RANK(expr [, expr ]...) WITHIN GROUP   (ORDER BY expr [ DESC | ASC ]

                 [ NULLS { FIRST | LAST } ]

            [,expr [ DESC | ASC ]

                   [ NULLS { FIRST | LAST } ]             ]...

  )

8.2 Analytic Syntax dense_rank_analytic::=

wps286A.tmp 

 

DENSE_RANK( )

   OVER([ query_partition_clause ] order_by_clause)

 

 

See A "Analy restric

lso:

tic Functions" for information on syntax, semantics, and tions

 

8.3 Purpose 

Rank values are not skipped

in the event of t

DENSE_RANK computes the rank of a row in an ordered group of rows and returns the rank as a NUMBER. The ranks are consecutive integers beginning with 1. The largest rank value is the number of unique values returned by the query. ies. Rows with equal values for the ranking criteria receive the same rank. This function is useful for top-N and bottom-N reporting.

Dense_rank計算有序組中行的排名,返回的排名是一個number數值。排名是從1開始的連續整數。排名的最大值是查詢返回的惟一值的個數。排名一旦與行關聯就不會產生跳躍的值。值相等的行排名相同。此函數對於計算top-Nbottom-N報表十分有用。 

This function accepts as arguments any numeric datatype and returns NUMBER.

函數接受任何數字類型的參數並返回number類型。 

? As an aggregate function, DENSE_RANK calculates the dense rank of a

hypothetical row identified by the arguments of the function with respect to a given

sort specification.

The arguments of the function must all evaluate to constant

expressions within each aggregate group, because they identify a single row within each group. The constant argument expressions and the expressions in the order_by_clause of the aggregate match by position. Therefore, the number of arguments must be the same and types must be compatible.

Dense_rank用做彙集函數時,它計算由一個帶有排序規則的函數參數肯定的假定行的密集排名。函數參數必須對每一個彙集分組中的常量表達式所有求值。常量參數表達式和彙集的order by子句中的表達式按位置進行匹配。所以,參數個數必須相同,參數類型必須兼容。 

? As an analytic function, DENSE_RANK computes the rank of each row returned from a query with respect to the other rows, based on the values of the value_exprs in the order_by_clause.

Dense_rank用做分析函數時,它計算按照order_by_clausevalue_exprs 值排序返回的查詢結果中,每一行相對於其餘行的排名。 

8.4 Aggregate Example

The following example computes the ranking of a hypothetical employee with the salary $15,500 and a commission of 5% in the sample table oe.employees:

下面的例子計算oe.employees表中薪水達到$15500而且佣金達到5%的假定僱員的排名: 

SELECT dense_rank(15500, .05) within

 GROUP(

 ORDER BY salary DESC, commission_pct) "Dense Rank"

  FROM employees;

 

         Dense Rank -------------------                   3

8.5 Analytic Example 

The following statement selects the department name, employee name, and salary of all employees who work in the human resources or purchasing department, and then computes a rank for each unique salary in each of the two departments. The salaries that are equal receive the same rank. Compare this example with the example for RANK.

下面的語句在在人力資源或採購部門中,選擇部門名稱,僱員名稱,僱員薪水,而後對這兩個部門中每一個惟一的薪水值排名。薪水相等則排名相同。請將本例與rank示例比較。 

SELECT d.department_name,        e.last_name,

       e.salary,

       dense_rank() over(PARTITION BY e.department_id ORDER BY e.salary) AS drank

  FROM employees e, departments d

 WHERE e.department_id = d.department_id

   AND d.department_id IN ('30', '40');

 

DEPARTMENT_NAME         LAST_NAME              SALARY      DRANK ----------------------- ------------------ ---------- ----------

Purchasing              Colmenares               2500          1

Purchasing              Himuro                  2600          2

Purchasing              Tobias                   2800          3 Purchasing              Baida                    2900          4 Purchasing              Khoo                     3100          5 Purchasing              Raphaely               11000          6

Human Resources         Marvis                   6500  

9. FIRST 

9.1 Syntax

first::=

wps286B.tmp 

 

aggregate_function

   KEEP 

   (DENSE_RANK FIRST ORDER BY     expr [ DESC | ASC ]

         [ NULLS { FIRST | LAST } ]

    [, expr [ DESC | ASC ]

            [ NULLS { FIRST | LAST } ]     ]...

   )

   [ OVER query_partition_clause ]

 

 

See A

lso:

"Analytic Functions" for information on syntax, semantics, and restrictions of the ORDER BY clause and OVER clause

 

9.2 Purpose 

FIRST and LAST are very similar functions. Both are aggregate and analytic functions that operate on a set of values from a set of rows that rank as the FIRST or LAST with respect to a given sorting specification. If only one row ranks as FIRST or LAST, the aggregate operates on the set with only one element.

Firstlast是很是相似的函數。它們均可用做彙集和分析函數,操做按排序規則排名後的行組中排名爲firstlast的值。若分組中只有排名爲firstlast的行,那末只對這個惟一元素進行彙集操做(意思是說,當分組中只有一行記錄時,不論firstlast 都取這一行――譯者注) 

This function takes as an argument any numeric datatype or any nonnumeric datatype that can be implicitly converted to a numeric datatype. The function returns the same datatype as the numeric datatype of the argument.

函數參數可取任何數字類型或者是任何能夠隱式轉換爲數字類型的非數字類型。函數返回類型與參數類型相同,都爲數字類型。 

When you need a value from the first or last row of a sorted group, but the needed value is not the sort key, the FIRST and LAST functions eliminate the need for self-joins or views and enable better performance.

當已排序組中第一行或最後一行的值不是排序鍵值時,爲了得到更好的性能,firstlast函數不會進行自鏈接或產生視圖。 

? The aggregate_function is any one of the MIN, MAX, SUM, AVG, COUNT, VARIANCE, or STDDEV functions. It operates on values from the rows that rank either FIRST or LAST. If only one row ranks as FIRST or LAST, the aggregate operates on a singleton (nonaggregate) set.

aggregate_function能夠是min,max,sum,avg,count,variance,

stddev函數中的任一個。它操做組中排名爲firstlast值。若分組中只有排名爲firstlast的行,那末只對這個惟一元素進行彙集操做。 

? The KEEP keyword is for semantic clarity. It qualifies aggregate_function, indicating that only the FIRST or LAST values of aggregate_function will be returned. 使用Keep關鍵字是爲了保持語義清晰。它限制aggregate_function,表示僅返回aggregate_functionfirstlast值。 

? DENSE_RANK FIRST or DENSE_RANK LAST indicates that Oracle Database will aggregate over only those rows with the minimum (FIRST) or the maximum (LAST) dense rank (also called olympic rank).

Dense_rank_firstdense_rank_last代表Oracle數據庫僅將排名爲最小 (first)或最大(last)的行彙集在一塊兒。 

You can use the FIRST and LAST functions as analytic functions by specifying the OVER clause. The query_partitioning_clause is the only part of the OVER clause valid with these functions.

Firstlast函數中指定over子句可用做分析函數。在這兩個分析函數的over子句中僅能使用query_partitioning_clause 

 

See Also:

Table 2-10, "Implicit Type Conversion Matrix" for more information on implicit conversion and LAST 

 

9.3 Aggregate Example 

The following example returns, within each department of the sample table hr.employees, the minimum salary among the employees who make the lowest commission and the maximum salary among the employees who make the highest commission:

下面的例子返回hr.employees表中每一個部門佣金最少僱員的最低薪水以及佣金最高僱員的最高薪水: 

SELECT department_id,

       MIN(salary) keep(dense_rank FIRST ORDER BY commission_pct) "Worst",

       MAX(salary) keep(dense_rank LAST ORDER BY commission_pct)

"Best"

  FROM employees

 GROUP BY department_id;

 

DEPARTMENT_ID      Worst       Best ------------- ---------- ----------            10       4400       4400            20       6000      13000

           30       2500      11000

           40       6500       6500

           50       2100       8200

           60       4200       9000

           70      10000      10000

           80       6100      14000

           90      17000      24000

          100       6900      12000

          110       8300      12000

                    7000       7000

9.4 Analytic Example 

The next example makes the same calculation as the previous example but returns the result for each employee within the department:

接下的例子對前例做相同的計算,但返回的是部門中每一個僱員的薪水: 

SELECT last_name,        department_id,        salary,

       MIN(salary) keep(dense_rank FIRST ORDER BY commission_pct) over(PARTITION BY department_id) "Worst",

       MAX(salary) keep(dense_rank LAST ORDER BY commission_pct)

over(PARTITION BY department_id) "Best"

  FROM employees

 ORDER BY department_id, salary;

 

LAST_NAME           DEPARTMENT_ID     SALARY      Worst       Best ------------------- ------------- ---------- ---------- ---------- Whalen                         10       4400       4400       4400 Fay                            20       6000       6000      13000 Hartstein                      20      13000       6000      13000

. . .

Gietz                         110       8300       8300      12000

Higgins                       110      12000       8300      12000

Grant                                   7000       7000       7000

 

10. FIRST_VALUE 

10.1 Syntax

wps287B.tmp 

FIRST_VALUE (expr [ IGNORE NULLS ])

   OVER (analytic_clause)

 

 

See A "Analy restric

lso:

tic Functions" for information on syntax, semantics, and tions, including valid forms of expr 

 

10.2 Purpose 

FIRST_VALUE is an analytic function. It returns the first value in an ordered set of values.

If the first value in the set is null, then the function returns NULL unless you specify

r data dens

IGNORE NULLS. This setting is useful fo ification. If you specify IGNORE NULLS, then FIRST_VALUE returns the fist non-null value in the set, or NULL if all values are null. Please refer to "Using Partitioned Outer Joins: Examples" for an example of data

densification.

First_value只用做分析函數。它返回已排序集的第一個值。若集合中的第一個值爲null,除非指定ignor nulls那末函數返回null。忽略空值的限定對稠化數據頗有用處。若指定ignor nulls,那末first_value函數返回集合中第一個不爲null的值,或若值全爲null則返回null。請參閱Using Partioned Outer Joins:Examples中關於稠化數據的例子。 

You cannot use FIRST_VALUE or any other analytic function for expr. That is, you cannot nest analytic functions, but you can use other built-in function expressions for expr. Please refer to "About SQL Expressions" for information on valid forms of expr.

不能在expr中使用first_value或其餘任何分析函數。也就是說,此處分析函數不能嵌套,但能夠在expr中使用內置函數表達式。請參閱About SQL Expressions獲取合法 expr的相關信息。 

10.3 Examples 

The following example selects, for each employee in Department 90, the name of the employee with the lowest salary.

下面的例子,選出部門90中薪水最低的每一僱員的名字: 

SELECT department_id,        last_name,        salary,

       first_value(last_name) over(ORDER BY salary ASC rows unbounded preceding) AS lowest_sal   FROM (SELECT *

          FROM employees

         WHERE department_id = 90 

         ORDER BY employee_id);

 

DEPARTMENT_ID LAST_NAME         SALARY LOWEST_SAL

------------- ------------- ---------- -------------------------

           90 Kochhar            17000 Kochhar

           90 De Haan            17000 Kochhar

           90 King               24000 Kochhar

 

The example illustrates the nondeterministic nature of the FIRST_VALUE function. Kochhar and DeHaan have the same salary, so are in adjacent rows. Kochhar appears first because the rows returned by the subquery are ordered by employee_id. However, if the rows returned by the subquery are ordered by employee_id in descending order, as in the next example, then the function returns a different value: 

這個例子代表了first_name函數的不肯定性。KochharDe Haan有相同的薪水,所以在行中位置相鄰。Kochhar出如今第一行,由於行是經過按employee_id排序的子查詢返回的。然而,若行是經過按employee_id降序排序的子查詢返回的,正以下面的例子同樣,那末函數返回的值不一樣: 

SELECT department_id,        last_name,        salary,

       first_value(last_name) over(ORDER BY salary ASC rows unbounded preceding) AS fv

  FROM (SELECT *

          FROM employees

         WHERE department_id = 90 

         ORDER BY employee_id DESC);

 

DEPARTMENT_ID LAST_NAME         SALARY FV

------------- ------------- ---------- -------------------------

           90 De Haan            17000 De Haan

           90 Kochhar            17000 De Haan

           90 King               24000 De Haan

 

The following example shows how to make the FIRST_VALUE function deterministic by ordering on a unique key.

下面的例子說明怎樣經過一個惟一鍵值排序使first_value函數具備肯定性: 

SELECT department_id,        last_name,        salary,        hire_date,

       first_value(last_name) over(ORDER BY salary ASC, hire_date rows unbounded preceding) AS fv   FROM (SELECT *

          FROM employees

         WHERE department_id = 90 

         ORDER BY employee_id DESC);

 

DEPARTMENT_ID LAST_NAME         SALARY HIRE_DATE FV

------------- ------------- ---------- --------- ---------------

           90 Kochhar            17000 21-SEP-89 Kochhar

           90 De Haan            17000 13-JAN-93 Kochhar

           90 King               24000 17-JUN-87 Kochhar

11. LAG 

11.1 Syntax

wps287C.tmp 

 

LAG(value_expr [, offset ] [, default ])

   OVER ([ query_partition_clause ] order_by_clause)

 

 

See Also:

"Analytic Functions" for information on syntax, semantics, and restrictions, including valid forms of value_expr 

 

11.2 Purpose 

LAG is an analytic function. It provides access to more than one row of a table at the same time without a self join. Given a series of rows returned from a query and a position of the cursor, LAG provides access to a row at a given physical offset prior to that position. 

Lag只能用做分析函數。它提供在不使用自鏈接的狀況下訪問表中多個行的途徑。給定要查詢的行組和一個位置指針,lag能根據給定的物理偏移量訪問前面位置的行。 

If you do not specify offset, then its default is 1. The optional default value is returned if the offset goes beyond the scope of the window. If you do not specify default, then its default is null.

若不指定offset,那末其默認爲1。若偏移量超出窗口範圍,則返回可選的default值。若沒有指定default,那末其默認爲null 

You cannot use LAG or any other analytic function for value_expr. That is, you cannot nest analytic functions, but you can use other built-in function expressions for value_expr.

不能在value_expr中使用lag或其餘任何分析函數。也就是說,此處分析函數不能嵌套。

可是能夠在value_expr中使用內置函數表達式。 

 

See Also:

"About SQL Expressions" for information on valid forms of expr and LEAD 

 

11.3 Examples 

The following example provides, for each salesperson in the employees table, the salary of the employee hired just before: 下面的例子提供employees表中每一個僱員正前一個被僱傭的僱員薪水: 

SELECT last_name,        hire_date,        salary,

       lag(salary, 1, 0) over(ORDER BY hire_date) AS prev_sal

  FROM employees

 WHERE job_id = 'PU_CLERK';

相關文章
相關標籤/搜索