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

1 ... 143 144 145 [ 146 ] 147 148 149 ... 219


6 group by e.empno,e.ename

7 order by 1

Обсуждение DB2

Первый шаг - с помощью ранжирующей функции ROW NUMBER OVER ранжируем все строки по EMPNO:

select row number()over(order by empno) grp, empno, ename from emp

EMPNO

ENAME

7369

SMITH

7499

ALLEN

7521

WARD

7566

JONES

7654

MARTIN

7698

BLAKE

7782

CLARK

7788

SCOTT

7839

KING

7844

TURNER

7876

ADAMS

7900

JAMES

7902

FORD

7934

MILLER

Когда все строки получили соответствующий ранг, создаем четыре блока с помощью функции вычисления остатка от деления MOD:

select mod(row number()over(order by empno),4) grp, empno, ename from emp

EMPNO

ENAME

7369

SMITH

7499

ALLEN

7521

WARD

7566

JONES

7654

MARTIN

7698

BLAKE

7782

CLARK

7788

SCOTT

7839

KING

7844

TURNER

7876

ADAMS

7900

JAMES



EMPNO

ENAME

EMPNO

ENAME

7369

SMITH

7369

SMITH

7369

SMITH

7499

ALLEN

7369

SMITH

7521

WARD

7369

SMITH

7566

JONES

7369

SMITH

7654

MARTIN

7369

SMITH

7698

BLAKE

7369

SMITH

7782

CLARK

7369

SMITH

7788

SCOTT

7369

SMITH

7839

KING

7369

SMITH

7844

TURNER

7369

SMITH

7876

ADAMS

7369

SMITH

7900

JAMES

7369

SMITH

7902

FORD

7369

SMITH

7934

MILLER

Как видно из приведенного результирующего множества, значение EMPNO служащего SMITH можно сравнить с EMPNO всех остальных служащих таблицы EMP (все EMPNO можно сравнить между собой). Следующий шаг - ограничить декартово произведение только теми значениями EMPNO, которые больше или равны другому EMPNO. Результирующее множество частично (поскольку в нем 105 строк) показано ниже:

select e.empno, e.ename,

1 7902 FORD

2 7934 MILLER

Последний шаг - добавить единицу к GRP, чтобы нумерация блоков начиналась не с 0, а с 1, и применить ORDER BY по GRP, чтобы сортировать строки по блокам.

Oracle и SQL Server

Всю работу выполняет функция NTILE. Просто передаем в нее число, представляющее требуемое количество блоков, и чудо происходит прямо на наших глазах.

MySQL и PostgreSQL

Первый шаг - сформировать декартово произведение таблицы EMP, так чтобы все значения EMPNO можно было сравнивать между собой (ниже показан лишь фрагмент декартова произведения, потому что оно включает 196 строк (14x14):

select e.empno, e.ename, d.empno, d.ename from emp e, emp d



d.empno, d.ename from emp e, emp d where e.empno >= d.empno

EMPNO

ENAME

EMPNO

ENAME

7934

MILLER

7934

MILLER

7934

MILLER

7902

FORD

7934

MILLER

7900

JAMES

7934

MILLER

7876

ADAMS

7934

MILLER

7844

TURNER

7934

MILLER

7839

KING

7934

MILLER

7788

SCOTT

7934

MILLER

7782

CLARK

7934

MILLER

7698

BLAKE

7934

MILLER

7654

MARTIN

7934

MILLER

7566

JONES

7934

MILLER

7521

WARD

7934

MILLER

7499

ALLEN

7934

MILLER

7369

SMITH

7499

ALLEN

7499

ALLEN

7499

ALLEN

7369

SMITH

7369

SMITH

7369

SMITH

Чтобы показать, как предикат WHERE ограничил декартово произведение, из всего результирующего множества я выбрал только строки (из EMP E) для служащих MILLER, ALLEN и SMITH. Поскольку предикат WHERE, используемый для отсеивания по EMPNO, соответствует условию больше чем или равно , мы гарантированно получим, по крайней мере, одну строку для каждого служащего, потому что каждое значение EMPNO равно самому себе. Но почему для служащего SMITH (в левой части результирующего множества) получена всего одна строка, тогда как для ALLEN их две и для MILLER их 14? Причина в процедуре сравнения значений EMPNO в предикате WHERE: выбираются значения больше чем или равные рассматриваемому. В случае со SMITH нет такого значения EMPNO, которое было бы меньше 7369, поэтому для SMITH возвращается только одна строка. В случае с ALLEN значение EMPNO служащего ALLEN, очевидно, равно самому себе (поэтому возвращена соответствующая строка), но 7499 к тому же больше 7369 (EMPNO служащего SMITH), поэтому для ALLEN возвращено две строки. Значение EMPNO служащего MILLER больше, чем EMPNO всех остальных служащих таблицы EMP (и, конечно, равно самому себе), поэтому для MILLER получаем 14 строк.

Теперь мы можем сравнить все EMPNO и выбрать строки, в которых одно значение больше другого. Используем агрегатную функцию COUNT, чтобы получить рефлексивное объединение, поскольку оно является наиболее выразительным результирующим множеством:



1 ... 143 144 145 [ 146 ] 147 148 149 ... 219

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