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

1 ... 124 125 126 [ 127 ] 128 129 130 ... 219


Общее число возвращенных строк может быть больше пяти, но разных заработных плат будет только пять. Используйте ROW NUMBER OVER, если хотите получить пять строк независимо от связей (поскольку эта функция не учитывает связи).

MySQL и PostgreSQL

Ранжирование заработных плат выполните с помощью скалярного подзапроса. Затем ограничьте результаты этого подзапроса соответственно рангу возвращенных строк:

select

ename,sal

from

select

(select c

from e

where a

a.sal,

a.ename

from

emp a

where

rnk <= 5

Обсуждение

DB2, Oracle и SQL Server

Все делает ранжирующая функция DENSE RANK OVER во вложенном запросе X. Следующий пример показывает всю таблицу после применения этой функции:

select ename, sal,

dense rank() over (order by sal desc) dr from emp

ENAME

KING

5000

SCOTT

3000

FORD

3000

JONES

2975

BLAKE

2850

CLARK

2450

ALLEN

1600

TURNER

1500

MILLER

1300

WARD

1250

MARTIN

1250

ADAMS

1100

JAMES

SMITH

Теперь осталось только выбрать строки, для которых DR меньше или равно пяти.



from emp

ENAME

5000

KING

3000

SCOTT

3000

FORD

2975

JONES

2850

BLAKE

2450

CLARK

1600

ALLEN

1500

TURNER

1300

MILLER

1250

WARD

1250

MARTIN

1100

ADAMS

JAMES

SMITH

Заключительный шаг - выбрать только те строки, в которых значение RNK меньше или равно пяти.

Как найти записи с наибольшим и наименьшим значениями

Задача

Требуется найти крайние значения (экстремумы) таблицы. Например, стоит задача выбрать из таблицы EMP служащих с наибольшей и наименьшей заработными платами.

Решение

DB2, Oracle и SQL Server

Для поиска наименьшей и наибольшей заработных плат используйте оконные функции MIN OVER и MAX OVER соответственно:

1 select ename

2 from (

3 select ename, sal,

4 min(sal)over() min sal,

5 max(sal)over() max sal

MySQL и PostgreSQL

Скалярный подзапрос во вложенном запросе X ранжирует заработные платы следующим образом:

select (select count(distinct b.sal)

from emp b

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



ENAME

MIN SAL

MAX SAL

SMITH

5000

ALLEN

1600

5000

WARD

1250

5000

JONES

2975

5000

MARTIN

1250

5000

BLAKE

2850

5000

CLARK

2450

5000

SCOTT

3000

5000

KING

5000

5000

TURNER

1500

5000

ADAMS

1100

5000

JAMES

5000

FORD

3000

5000

MILLER

1300

5000

Имея это результирующее множество, осталось лишь выбрать строки, в которых значение SAL равно MIN SAL или MAX SAL.

MySQL и PostgreSQL

В этом решении для поиска наименьшей и наибольшей заработных плат используются два подзапроса в одном списке оператора IN. Внешний запрос возвращает строки, в которых значения заработных плат соответствуют значениям, возвращенным хотя бы одним из подзапросов.

6 from emp

7 ) x

8 where sal in (min sal,max sal)

MySQL и PostgreSQL

Напишите два подзапроса: один для возвращения MIN значения SAL, другой - MAX значения SAL:

1 select ename

2 from emp

3 where sal in ( (select min(sal) from emp),

4 (select max(sal) from emp) )

Обсуждение

DB2, Oracle и SQL Server

Оконные функции MIN OVER и MAX OVER обеспечивают возможность доступа к наименьшей и наибольшей заработным платам в каждой строке. Результирующее множество вложенного запроса Х следующее:

select ename, sal,

min(sal)over() min sal,

max(sal)over() max sal from emp



1 ... 124 125 126 [ 127 ] 128 129 130 ... 219

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