Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Semestr2 / 1 - Oracle / Oracle selected docs / SQL reference.pdf
Скачиваний:
24
Добавлен:
12.05.2015
Размер:
11.92 Mб
Скачать

 

 

 

 

FIRST_VALUE

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

FIRST_VALUE

Syntax

first_value::=

FIRST_VALUE ( expr ) OVER ( analytic_clause )

See Also: "Analytic Functions" on page 6-10 for information on syntax, semantics, and restrictions

Purpose

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

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

See Also: "About SQL Expressions" on page 4-2 for information on valid forms of expr

Examples

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

Functions 6-69

FIRST_VALUE

SELECT departmeent_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:

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.

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

6-70 Oracle9i SQL Reference

FROM_TZ

FLOOR

Syntax

floor::=

FLOOR ( n )

Purpose

FLOOR returns largest integer equal to or less than n.

Examples

The following example returns the largest integer equal to or less than 15.7:

SELECT FLOOR(15.7) "Floor" FROM DUAL;

Floor

----------

15

FROM_TZ

Syntax from_tz::=

FROM_TZ ( timestamp_value , time_zone_value )

Purpose

FROM_TZ converts a timestamp value at a time zone to a TIMESTAMP WITH TIME ZONE value. time_zone_value is a character string in the format ’TZH:TZM’ or a character expression that returns a string in TZR with optional TZD format.

Examples

The following example returns a timestamp value to TIMESTAMP WITH TIME ZONE:

SELECT FROM_TZ(TIMESTAMP ’2000-03-28 08:00:00’, ’3:00’)

FROM DUAL;

Functions 6-71

GREATEST

FROM_TZ(TIMESTAMP’2000-03-2808:00:00’,’3:00’)

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

28-MAR-00 08.00.00 AM +03:00

GREATEST

Syntax greatest::=

 

 

,

 

GREATEST

(

expr

)

Purpose

GREATEST returns the greatest of the list of exprs. All exprs after the first are implicitly converted to the datatype of the first expr before the comparison. Oracle compares the exprs using nonpadded comparison semantics. Character comparison is based on the value of the character in the database character set. One character is greater than another if it has a higher character set value. If the value returned by this function is character data, then its datatype is always VARCHAR2.

See Also: "Datatype Comparison Rules" on page 2-45

Examples

The following statement selects the string with the greatest value:

SELECT GREATEST (’HARRY’, ’HARRIOT’, ’HAROLD’)

"Greatest" FROM DUAL;

Greatest

--------

HARRY

GROUP_ID

Syntax group_id::=

GROUP_ID ( )

6-72 Oracle9i SQL Reference

GROUP_ID

Purpose

GROUP_ID distinguishes duplicate groups resulting from a GROUP BY specification. It is therefore useful in filtering out duplicate groupings from the query result. It returns an Oracle NUMBER to uniquely identify duplicate groups. This function is applicable only in a SELECT statement that contains a GROUP BY clause.

If n duplicates exist for a particular grouping, then GROUP_ID returns numbers in the range 0 to n-1.

Examples

The following example assigns the value "1" to the duplicate co.country_region grouping from a query on the sample tables sh.countries and sh.sales:

SELECT co.country_region, co.country_subregion, SUM(s.amount_sold) "Revenue",

GROUP_ID() g

FROM sales s, customers c, countries co WHERE s.cust_id = c.cust_id AND

c.country_id = co.country_id AND s.time_id = ’1-JAN-00’ AND

co.country_region IN (’Americas’, ’Europe’) GROUP BY co.country_region,

ROLLUP (co.country_region, co.country_subregion);

 

COUNTRY_REGION

COUNTRY_SUBREGION

Revenue

G

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

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

Americas

Northern America

220844

0

Americas

Southern America

10872

0

Europe

Eastern Europe

12751

0

Europe

Western Europe

558686

0

Americas

 

231716

0

Europe

 

571437

0

Americas

 

231716

1

Europe

 

571437

1

You could add the following HAVING clause to the end of the statement to ensure that only rows with GROUP_ID < 1 are returned:

HAVING GROUP_ID() < 1

Functions 6-73

Соседние файлы в папке Oracle selected docs