|
Программирование >> Преобразование значений null
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
Следующий шаг - после деления 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
Создание заданного количества блоков Задача Требуется организовать данные в определенное число блоков. Например, записи служащих в таблице EMP должны быть разделены на четыре группы. Ниже представлено предполагаемое результирующее
Эта задача обратная предыдущей, где число блоков было неизвестно, но было задано количество элементов в каждом из них. Особенность данного рецепта в том, что мы можем не знать, сколько элементов в каждом блоке, но количество блоков определено заранее. Решение Решение этой задачи не составляет труда, если используемая СУБД обеспечивает функции для создания блоков строк. Если СУБД не предоставляет таких функций, можно просто ранжировать строки и затем распределить их по блокам соответственно остатку от деления их ранга на и, где 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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |