Gerard McLaughlin
Gerard McLaughlin

Reputation: 37

PLSQL Need to match up nested records

I have a table with records showing when an item is put on hold or released. Nested holds are possible. Some records have become mixed up, new logic is needed. To fix this I need to match the release to the hold - I have a roughly drawn example below - the id column doesn't exist but is what I need to generate.

Example data

The table I'm working from has no unique identifier I can use and nothing to match the release to the hold except the order they happen in. I've been playing with this for a while and can't nail it down.

The problem comes when I get 2 or more hold sin a row without a release. If we have hold1, hold2 and hold3 then the releases after this should be read in the order release3, release2, release1.

Any help or suggestions would be greatly appreciated.

CREATE TABLE "TBL_ACTIONS" 
   ("ITEM_ID" CHAR(5 BYTE), 
    "ACTION_DATE" DATE, 
    "ACTION" VARCHAR2(40 BYTE)
   );

Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('19/11/16 01:00:28','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('19/11/16 01:12:45','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('19/11/16 16:00:19','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('19/11/16 16:12:40','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('20/11/16 14:52:42','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('20/11/16 16:00:10','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('24/11/16 17:52:49','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('24/11/16 21:12:40','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('24/11/16 23:12:48','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('24/11/16 23:32:39','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('28/11/16 14:40:17','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('28/11/16 14:40:18','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('28/11/16 19:12:40','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('29/11/16 08:17:59','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('29/11/16 08:17:59','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('29/11/16 08:18:40','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('29/11/16 08:18:40','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('01/12/16 11:03:39','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('02/12/16 08:10:51','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('02/12/16 11:27:06','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('02/12/16 11:27:11','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('03/12/16 07:10:07','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('03/12/16 07:10:07','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('16/12/16 14:37:39','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('16/12/16 14:37:40','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('22/12/16 12:20:52','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('22/12/16 12:20:52','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('22/12/16 12:29:39','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('22/12/16 12:29:39','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('06/01/17 10:23:47','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('06/01/17 10:23:48','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('06/01/17 11:52:26','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('06/01/17 11:52:26','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('09/01/17 13:47:52','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('09/01/17 13:47:59','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('25/01/17 09:42:35','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('25/01/17 09:42:35','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('31/01/17 12:11:24','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('31/01/17 12:11:31','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('31/01/17 12:12:20','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('31/01/17 12:12:28','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('02/02/17 09:01:48','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('02/02/17 09:01:48','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('02/02/17 09:02:58','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('02/02/17 09:02:58','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('06/02/17 16:57:47','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('06/02/17 16:57:47','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('07/02/17 16:56:39','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('07/02/17 16:56:47','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('07/02/17 16:57:12','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('07/02/17 16:57:21','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('08/02/17 16:41:54','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('08/02/17 16:41:54','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('08/02/17 17:21:53','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('08/02/17 17:22:04','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('09/02/17 16:38:35','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('09/02/17 16:38:43','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('10/02/17 07:40:05','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('10/02/17 07:40:13','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('10/02/17 23:31:52','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('10/02/17 23:31:52','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('11/02/17 09:16:22','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('11/02/17 09:16:23','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('17/02/17 16:48:13','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('17/02/17 16:48:13','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('17/02/17 16:49:16','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('17/02/17 16:49:17','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('21/02/17 15:42:40','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('21/02/17 17:25:08','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('21/02/17 17:25:09','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('21/02/17 17:25:18','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('21/02/17 17:25:18','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('27/02/17 16:51:39','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('27/02/17 16:51:39','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('27/02/17 16:51:46','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('27/02/17 16:51:46','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('28/02/17 14:06:59','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('28/02/17 14:06:59','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('28/02/17 14:07:10','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('28/02/17 14:07:10','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('03/03/17 10:04:08','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('03/03/17 10:04:08','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('03/03/17 10:04:09','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('03/03/17 10:04:09','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('03/03/17 10:23:27','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('03/03/17 10:23:27','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('03/03/17 10:23:27','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('03/03/17 10:23:27','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('03/03/17 10:55:55','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('03/03/17 10:55:55','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('03/03/17 10:55:55','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('03/03/17 10:55:55','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('06/03/17 13:23:25','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('06/03/17 13:23:25','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('06/03/17 13:23:26','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('06/03/17 13:23:26','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('06/03/17 15:07:20','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('06/03/17 15:10:09','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('08/03/17 15:35:45','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('10/03/17 12:17:36','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('10/03/17 12:17:37','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('10/03/17 13:22:47','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('10/03/17 13:22:55','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('10/03/17 13:23:20','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('10/03/17 13:23:27','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('18/03/17 07:12:27','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('18/03/17 07:12:28','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('30/03/17 16:17:54','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('30/03/17 17:52:44','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('30/03/17 18:12:49','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('30/03/17 23:32:45','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('01/04/17 20:32:34','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('02/04/17 19:53:43','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('02/04/17 20:52:44','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('04/04/17 21:39:18','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('04/04/17 21:45:23','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('05/04/17 20:54:49','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('05/04/17 21:00:19','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('10/04/17 17:35:13','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('17/04/17 11:29:33','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('17/04/17 21:32:44','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('18/04/17 00:40:12','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('23/04/17 09:20:35','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('23/04/17 10:52:41','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('25/04/17 20:40:50','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('25/04/17 20:52:47','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('28/04/17 01:13:17','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('28/04/17 04:32:35','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('30/04/17 16:12:47','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('30/04/17 16:20:08','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('30/04/17 16:40:32','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('30/04/17 18:20:19','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('01/05/17 03:12:06','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('17/05/17 16:58:17','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('17/05/17 16:58:17','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('19/05/17 15:10:28','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('19/05/17 15:10:28','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('28/05/17 21:14:06','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('30/05/17 15:41:58','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('31/05/17 10:05:00','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('31/05/17 10:05:11','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('31/05/17 10:05:17','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('31/05/17 10:05:27','DD/MM/YY HH24:MI:SS'),'Hold');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('02/06/17 00:30:22','DD/MM/YY HH24:MI:SS'),'Release');
    Insert into TBL_ACTIONS (ITEM_ID,ACTION_DATE,ACTION) values ('ITEM1',to_date('04/06/17 06:43:33','DD/MM/YY HH24:MI:SS'),'Hold');

Upvotes: 2

Views: 89

Answers (1)

Steve Lovell
Steve Lovell

Reputation: 2564

As per comments, I've assumed you have an ID column which can be used for ordering. I imagine there may be more efficient ways to do the following (I'd search for Last-In, First-Out or LIFO), but I wanted to see what I could come up with under my own steam:

With PushPop as (
select
    nh1.Id,
    nh1.Activity,
    sum(case when nh2.Activity = 'Release' then -1 else 1 end) as PushPop
from
    NestedHolds nh1
    LEFT JOIN NestedHolds nh2 ON
        nh1.Id >= nh2.Id
group by
    nh1.Id,
    nh1.Activity
order by
    nh1.id
)

SELECT
nh.*,
NewIDs.NewID
from
NestedHolds nh
JOIN
(
SELECT 
    a.Id HoldId,
    min(b.Id) as ReleaseId,
    row_number() over (order by a.Id) NewID
FROM
    PushPop a
    JOIN PushPop b ON
        a.Id < b.Id
        AND a.PushPop = b.PushPop + 1 
WHERE
a.Activity = 'Hold'
AND b.Activity = 'Release'
GROUP BY
    a.Id
order by
a.Id
) NewIDs on nh.Id in (NewIDs.HoldID, NewIDs.ReleaseID)
order by nh.id
;

Upvotes: 2

Related Questions