Программирование >>  Преобразование значений null 

1 ... 127 128 129 [ 130 ] 131 132 133 ... 219


скобки), возвратят наименьшую и наибольшую заработные платы таблицы соответственно. Результаты представлены ниже:

select ename,sal,

nvl(lead(sal)over(order by sal),min(sal)over()) forward, nvl(lag(sal)over(order by sal),max(sal)over()) rewind from emp

ENAME

FORWARD

REWIND

SMITH

5000

JAMES

1100

ADAMS

1100

1250

WARD

1250

1250

1100

MARTIN

1250

1300

1250

MILLER

1300

1500

1250

TURNER

1500

1600

1300

ALLEN

1600

2450

1500

CLARK

2450

2850

1600

BLAKE

2850

2975

2450

JONES

2975

3000

2850

SCOTT

3000

3000

2975

FORD

3000

5000

3000

KING

5000

3000

Другое полезное свойство LAG OVER и LEAD OVER - возможность задавать, как далеко вперед или назад требуется уйти. В примере данного рецепта мы заглядываем только на одну строку вперед или назад. Так же просто перейти на три строки вперед и пять строк назад; просто задаем значения 3 и 5, как показано ниже:

select ename,sal,

lead(sal,3)over(order by sal) forward, lag(sal,5)over(order by sal) rewind from emp

ENAME

FORWARD

REWIND

SMITH

1250

JAMES

1250

ADAMS

1100

1300

WARD

1250

1500

MARTIN

1250

1600

MILLER

1300

2450

TURNER

1500

2850

ALLEN

1600

2975

1100

CLARK

2450

3000

1250

BLAKE

2850

3000

1250

JONES

2975

5000

1300

SCOTT

3000

1500

FORD

3000

1600

KING

5000

2450



Ранжирование результатов Задача

Требуется ранжировать заработные платы в таблице EMP, учитывая при этом дублирующиеся значения. Должно быть получено следующее результирующее множество:

1100

1250

1250

1300

1500

1600

2450

2850

2975

3000

3000

5000

Решение

Ранжирующие функции чрезвычайно упрощают ранжирующие запросы. Особенно полезны в данном случае три функции: DENSE

RANK OVER, ROW NUMBER OVER и RANK OVER.

DB2, Oracle и SQL Server

Поскольку требуется учитывать дубликаты, используйте ранжирующую функцию DENSE RANK OVER:

1 select dense rank() over(order by sal) rnk, sal

2 from emp

MySQL и PostgreSQL

Пока не введены ранжирующие функции, для ранжирования заработных плат используйте скалярный подзапрос:

1 select (select count(distinct b.sal)

2 from emp b

3 where b.sal <= a.sal) as rnk,

4 a.sal

5 from emp a



Обсуждение

DB2, Oracle и SQL Server

Здесь всю работу выполняет ранжирующая функция DENSE RANK OVER. В скобках после ключевого слова OVER располагается конструкция ORDER BY, определяющая порядок ранжирования строк. В решении используется выражение ORDER BY SAL, таким образом, строки таблицы EMP ранжируются в порядке возрастания заработной платы.

MySQL и PostgreSQL

Результат решения с использованием скалярного подзапроса аналогичен результату решения с DENSE RANK, потому что управляющий предикат в скалярном подзапросе определяется по SAL.

Исключение дубликатов Задача

Требуется выбрать из таблицы EMP разные типы должностей, без дублирования. Результирующее множество должно быть таким:

ANALYST

CLERK

MANAGER

PRESIDENT

SALESMAN

Решение

Все СУБД поддерживают ключевое слово DISTINCT, и его применение, вероятно, является самым простым способом исключения дубликатов из результирующего множества. Однако в этом рецепте также будут рассмотрены еще два метода, позволяющие избавиться от дубликатов.

DB2, Oracle и SQL Server

Конечно, традиционный метод с использованием DISTINCT и иногда GROUP BY (как видно далее в решении для MySQL/PostgreSQL) подходит для этих СУБД. Ниже представлено альтернативное решение, в котором применяется ранжирующая функция ROW NUMBER OVER:

1 select ]ob

2 from (

3 select ]ob,

4 row number()over(partition by job order by job) rn

5 from emp

6 ) x

7 where rn = 1



1 ... 127 128 129 [ 130 ] 131 132 133 ... 219

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика