Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.misc -> Re: Aggregation Problem
"Björn Wächter" <bwc_at_p3-solutionsKILL_SPAM.de> a écrit dans le message de news: 5o66hvFl9hevU1_at_mid.dfncis.de...
| Hi all,
|
|
| I'm looking for a function that can calculate the following:
| I have a table like this:
|
| STATE_ID | SERVICE_STATE
| -------------------------------------
| 1 | OK
| 2 | OK
| 3 | ERROR
| 4 | ERROR
| 5 | ERROR
| 6 | ERROR
| 7 | ERROR
| 8 | OK
| 9 | OK
|
| I want a query thats shows all rows of the table but has a new
| column. Which has a kind of group_id that is not changing if the
| SERVICE_SATE is not changing from one STATE_ID to the next per
| SEVICE_ID:
|
| STATE_ID | SERVICE_STATE | CONTINUE_GROUP
| --------------------------------------------------
| 1 | OK | 1
| 2 | OK | 1
| 3 | ERROR | 2
| 4 | ERROR | 2
| 5 | ERROR | 2
| 6 | ERROR | 2
| 7 | ERROR | 2
| 8 | OK | 3
| 9 | OK | 3
|
| So in this example the SERVICE_STATE is changing for
| STATE_ID 2 to 3 from OK to ERROR so there is a new
| CONTINUE_GROUP = 2. And again a change from ERROR to OK
| for STATE_ID 7 to 8 and the new CONTINUE_GROUP = 3.
| Is there an aggregation function that can do this?
|
| Thanks Björn
SQL> select * from t order by state_id;
STATE_ID SERVICE_ST
---------- ----------
1 OK 2 OK 3 ERROR 4 ERROR 5 ERROR 6 ERROR 7 ERROR 8 OK 9 OK
9 rows selected.
SQL> with
2 data as (
3 select state_id, service_state, 4 case 5 when lag(service_state) over (order by state_id) = service_state 6 then null 7 else row_number() over (order by state_id) 8 end grp 9 from t
12 select state_id, service_state, 13 max(grp) over (order by state_id) grp 14 from data
1 OK 1 2 OK 1 3 ERROR 2 4 ERROR 2 5 ERROR 2 6 ERROR 2 7 ERROR 2 8 OK 3 9 OK 3
9 rows selected.
Regards
Michel Cadot
Received on Tue Oct 23 2007 - 11:48:47 CDT