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

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


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

1.00

28-JUL-2005

19:03:12

1.20

28-JUL-2005

19:03:13

1.40

28-JUL-2005

19:03:14

1.60

28-JUL-2005

19:03:15

1.80

28-JUL-2005

19:03:16

2.00

28-JUL-2005

19:03:17

2.20

28-JUL-2005

19:03:18

2.40

28-JUL-2005

19:03:19

2.60

28-JUL-2005

19:03:20

2.80

28-JUL-2005

19:03:21

3.00

28-JUL-2005

19:03:22

3.20

28-JUL-2005

19:03:23

3.40

28-JUL-2005

19:03:24

3.60

28-JUL-2005

19:03:25

3.80

28-JUL-2005

19:03:26

4.00

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

select ceil(trx id/5.0) as grp,

min(trx date) as trx start,

max(trx date) as trx end,

sum(trx cnt) as total from trx log

group by ceil(trx id/5.0)

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

Если ваши данные немного отличаются от рассматриваемых (скажем, строки не имеют ID), всегда можно создать подобные группы путем деления секунд из значений TRX DATE на 5. Затем для каждого значения TRX DATE включаем часы и группируем по фактическому часу и логической группе , GRP. Ниже представлен пример реализации такой техники (фигурирующие здесь функции Oracle TO CHAR и TO NUMBER необходимо заменить на функции работы с датами и форматирования символов, соответствующие используемой платформе):

select trx date,trx cnt,

to number(to char(trx date,hh24)) hr,

ceil(to number(to char(trx date-1/24/60/60,miss))/5.0) grp from trx log



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

28-JUL-2005

19:03:20

28-JUL-2005

19:03:21

28-JUL-2005

19:03:22

28-JUL-2005

19:03:23

28-JUL-2005

19:03:24

28-JUL-2005

19:03:25

28-JUL-2005

19:03:26

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

select hr,grp,sum(trx cnt) total from (

select trx date,trx cnt,

to number(to char(trx date,hh24)) hr,

ceil(to number(to char(trx date-1/24/60/60,miss))/5.0) grp

from

trx log

group

by hr,grp

TOTAL

Группировать транзакции по часу можно, если журнал транзакций охватывает большие промежутки времени. В DB2 и Oracle такой же результат можно получить с помощью оконной функции SUM OVER. Следующий запрос возвращает все строки таблицы TRX LOG и, логически их группируя, вычисляет промежуточные суммы (столбец TRX CNT) и общую сумму транзакций TOTAL (столбец TRX CNT) в каждой строке группы :

select trx id, trx date, trx cnt,

sum(trx cnt)over(partition by ceil(trx id/5.0)



order by trx date range between unbounded preceding and current row) runing total,

sum(trx cnt)over(partition by ceil(trx id/5.0)) total,

case when mod(trx id,5.0) = 0 then X end grp end

from

trx log

TRX ID

TRX DATE

TRX CNT

RUNING TOTAL

TOTAL

GRP END

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

28-JUL-2005

19:03:20

28-JUL-2005

19:03:21

28-JUL-2005

19:03:22

28-JUL-2005

19:03:23

28-JUL-2005

19:03:24

28-JUL-2005

19:03:25

28-JUL-2005

19:03:26

Агрегация разных групп/сегментов одновременно

Задача

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

ENAME

DEPTNO DEPTNO CNT JOB

JOB CNT

TOTAL

MILLER

3 CLERK

CLARK

3 MANAGER

KING

3 PRESIDENT

SCOTT

5 ANALYST

FORD

5 ANALYST

SMITH

5 CLERK

JONES

5 MANAGER

ADAMS

5 CLERK



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

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