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

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


7788

SCOTT

7839

KING

7844

TURNER

7876

ADAMS

7900

JAMES

7902

FORD

7934

MILLER

PostgreSQL и MySQL

Первый шаг - использовать скалярный подзапрос, чтобы ранжировать строки по EMPNO:

select (select count(*) from emp d

where e.empno < d.empno)+1 as rnk, e.empno, e.ename from emp e order by 1

EMPNO

ENAME

7934

MILLER

7902

FORD

7900

JAMES

7876

ADAMS

7844

TURNER

7839

KING

7788

SCOTT

7782

CLARK

7698

BLAKE

7654

MARTIN

7566

JONES

7521

WARD

7499

ALLEN

7369

SMITH

Следующий шаг - после деления RNK на 5 применить функцию CEIL. Деление на 5 логически организует строки в группы по пять, т. е. пять значений, меньших или равных 1; пять значений, больших 1, но меньших или равных 2; последней группе (состоящей из последних четырех строк, поскольку 14, количество строк в таблице EMP, не кратно 5) соответствуют значения, которые больше 2, но меньше или равны 3. Результаты деления и применения CEIL показаны ниже. Проследить порядок операций можно слева направо, от RNK до GRP:

select rnk,

rnk/5.0 as division, ceil(rnk/5.0) as grp, empno, ename from (

select e.empno, e.ename,

(select count(*) from emp d where e.empno < d.empno)+1 as rnk



from emp e ) x

order by 1

DIVISION

EMPNO

ENAME

7934

MILLER

7902

FORD

7900

JAMES

7876

ADAMS

7844

TURNER

7839

KING

7788

SCOTT

7782

CLARK

7698

BLAKE

7654

MARTIN

7566

JONES

7521

WARD

7499

ALLEN

7369

SMITH

Создание заданного количества блоков Задача

Требуется организовать данные в определенное число блоков. Например, записи служащих в таблице 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

Эта задача обратная предыдущей, где число блоков было неизвестно, но было задано количество элементов в каждом из них. Особенность данного рецепта в том, что мы можем не знать, сколько элементов в каждом блоке, но количество блоков определено заранее.



Решение

Решение этой задачи не составляет труда, если используемая СУБД обеспечивает функции для создания блоков строк. Если СУБД не предоставляет таких функций, можно просто ранжировать строки и затем распределить их по блокам соответственно остатку от деления их ранга на и, где n - количество блоков, которое должно быть создано. Если доступна оконная функция NTILE, она будет использоваться для создания заданного числа блоков. NTILE разбивает упорядоченное множество на требуемое число сегментов. При этом, если количество записей не делится на это число нацело, записи остатка распределяются в доступные блоки, начиная с первого. Это видно из результирующего множества, которое требуется получить в данном рецепте: блоки 1 и 2 включают по 4 строки, блоки 3 и 4 - по три. Если СУБД не поддерживает NTILE, не надо беспокоиться о том, в какие блоки попадут те или иные строки. Основная цель данного рецепта - создание заданного количества блоков.

С помощью ранжирующей функции ROW NUMBER OVER ранжируйте строки по EMPNO, затем соответственно остаткам от деления рангов на 4 организуйте четыре блока:

1 select mod(row number()over(order by empno),4)+1 grp,

2 empno,

3 ename

4 from emp

5 order by 1

Oracle и SQL Server

Для этих баз данных подойдет решение для DB2, но в качестве альтернативы (и проще) для создания четырех блоков можно использовать оконную функцию NTILE:

1 select ntile(4)over(order by empno) grp,

2 empno,

3 ename

4 from emp

MySQL и PostgreSQL

Используя рефлексивное объединение, ранжируйте строки по EMP-NO, затем соответственно остаткам от деления рангов на 4 организуйте необходимые блоки:

1 select mod(count(*),4)+1 as grp,

2 e.empno,

3 e.ename

4 from emp e, emp d

5 where e.empno >= d.empno



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

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