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

1 ... 154 155 156 [ 157 ] 158 159 160 ... 219


Создание разреженной матрицы Задача

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

CLERKS MGRS PREZ ANALS SALES

CLARK KING

MILLER

SMITH JONES

SCOTT

ADAMS FORD

SMITH

ALLEN WARD

MARTIN BLAKE

TURNER JAMES

JONES

BLAKE CLARK

ALLEN WARD

MARTIN

SCOTT

KING

TURNER

ADAMS JAMES

MILLER

FORD

Решение

Для создания разреженной таблицы, в которой строки транспонированы в столбцы, используйте выражения CASE:

1 select case deptno when 10 then ename

2 case deptno when 20 then ename

3 case deptno when 30 then ename

4 case job when CLERK then

5 case job when MANAGER then

6 case job when PRESIDENT then

7 case job when ANALYST then

8 case job when SALESMAN then

9 from emp

end as d10, end as d20, end as d30, ename end as clerks, ename end as mgrs, ename end as prez, ename end as anals, ename end as sales

Обсуждение

Чтобы превратить строки DEPTNO и JOB в столбцы, просто используем выражение CASE, обрабатывающее значения, которые могут быть возвращены в этих строках. Вот и все. В дополнение к этому, если требуется уплотнить отчет и избавиться от строк со значениями NULL, необходимо определиться с принципом группировки. Например, с помощью ранжирующей функции ROW NUMBER OVER присвойте ранги всем служащим, разделяя их по DEPTNO, и затем, применяя агрегатную функцию MAX, удалите некоторые значения NULL:

select max(case deptno when 10 then ename end) d10, max(case deptno when 20 then ename end) d20, max(case deptno when 30 then ename end) d30,



max(case job when CLERK then ename end) clerks, max(case job when MANAGER then ename end) mgrs, max(case job when PRESIDENT then ename end) prez, max(case job when ANALYST then ename end) anals, max(case job when SALESMAN then ename end) sales from (

select deptno, job, ename,

row number()over(partition by deptno order by empno) rn from emp ) x group by rn

CLERKS MGRS PREZ ANALS SALES

CLARK SMITH ALLEN SMITH CLARK ALLEN

KING JONES WARD JONES KING WARD

MILLER SCOTT MARTIN MILLER SCOTT MARTIN

ADAMS BLAKE ADAMS BLAKE

FORD TURNER FORD TURNER

JAMES JAMES

Группировка строк по интервалам времени Задача

Требуется обобщить данные по некоторому интервалу времени. Например, имеется журнал транзакций. Необходимо разбить период наблюдений на 5-секундные интервалы и показать, сколько транзакций имело место в каждый из этих интервалов. Строки таблицы TRX LOG показаны ниже:

select

trx id,

trx date,

trx cnt

from

trx log

TRX ID

TRX DATE

TRX CNT

28-JUL-2005

19:03:07

28-JUL-2005

19:03:08

28-JUL-2005

19:03:09

28-JUL-2005

19:03:10

28-JUL-2005

19:03:11

28-JUL-2005

19:03:12

28-JUL-2005

19:03:13

28-JUL-2005

19:03:14

28-JUL-2005

19:03:15

28-JUL-2005

19:03:16

28-JUL-2005

19:03:17

28-JUL-2005

19:03:18

28-JUL-2005

19:03:19



Обсуждение

Первый и ключевой для всего решения шаг - сгруппировать строки. Сформировать логические группы можно путем деления уникальных идентификаторов записей на 5 и возвращения наименьшего целого числа, которое больше, чем остаток от деления. Например:

select trx id,

trx date, trx cnt,

trx id/5.0 as val,

ceil(trx id/5.0) as grp from trx log

TRX ID TRX DATE TRX CNT VAL GRP

14 28-JUL-2005 19:03:20 48

15 28-JUL-2005 19:03:21 46

16 28-JUL-2005 19:03:22 44

17 28-JUL-2005 19:03:23 36

18 28-JUL-2005 19:03:24 41

19 28-JUL-2005 19:03:25 33

20 28-JUL-2005 19:03:26 19

Должно быть получено следующее результирующее множество:

GRP TRX START TRX END TOTAL

1 28-JUL-2005 19:03:07 28-JUL-2005 19:03:11 141

2 28-JUL-2005 19:03:12 28-JUL-2005 19:03:16 178

3 28-JUL-2005 19:03:17 28-JUL-2005 19:03:21 202

4 28-JUL-2005 19:03:22 28-JUL-2005 19:03:26 173

Решение

Группировать записи в блоки по пять строк. Такую логическую группировку можно реализовать несколькими способами. В данном рецепте она осуществляется путем деления значений TRX ID на 5, т. е. используется техника, представленная ранее в разделе Создание блоков данных фиксированного размера .

Когда группы установлены, с помощью агрегатных функций MIN, MAX и SUM определяются начальное время, конечное время и общее количество транзакций в каждой группе (для SQL Server используется функция CEILING, а не CEIL):

1 select ceil(trx id/5.0) as grp,

2 min(trx date) as trx start,

3 max(trx date) as trx end,

4 sum(trx cnt) as total

5 from trx log

6 group by ceil(trx id/5.0)



1 ... 154 155 156 [ 157 ] 158 159 160 ... 219

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