I have the below table (my input would be just columns NIF, FILE and FILESIZE).
I would like to obtain columns PARTITION and SUBPARTITION with the following rules:
- PARTITION should start with 1 and be incremented by 1 every tune SUBPARTITION reaches 8.
- A single NIF cannot be in two different PARTITIONs. (This is the most restrictive condition actually).
- SUBPARTITION must be incremented by 1 every time the running total in FILESIZE reaches 10. That running total must be reset when SUBPARTITION is incremented by 1.
Data:
NIF FILE FILESIZE PARTITION SUBPARTITION
----------------------------------------------
A C1 1 1 1
A C2 1 1 1
A C3 2 1 1
A C4 1 1 1
B C5 5 1 2
B C6 1 1 2
C C7 2 1 2
C C8 1 1 2
D C9 4 1 3
D C10 5 1 3
D C11 1 1 3
D C12 2 1 4
D C13 3 1 4
D C14 4 1 4
D C15 5 1 5
E C16 3 1 6
E C17 2 1 6
E C18 3 1 6
E C19 4 1 7
F C20 6 2 1
F C20 2 2 1
It does not need to be a single query, doing a PSLQL cursor would also be fine.
NOTE: this is the code to create the input table.
DROP TABLE my_table;
-- Create the table
CREATE TABLE my_table (
NIF VARCHAR2(10),
FILE_ VARCHAR2(10),
FILESIZE NUMBER
);
-- Insert the input data
INSERT INTO my_table (NIF, FILE_, FILESIZE)
SELECT 'A', 'C1', 1 FROM DUAL UNION ALL
SELECT 'A', 'C2', 1 FROM DUAL UNION ALL
SELECT 'A', 'C3', 2 FROM DUAL UNION ALL
SELECT 'A', 'C4', 1 FROM DUAL UNION ALL
SELECT 'B', 'C5', 5 FROM DUAL UNION ALL
SELECT 'B', 'C6', 1 FROM DUAL UNION ALL
SELECT 'C', 'C7', 2 FROM DUAL UNION ALL
SELECT 'C', 'C8', 1 FROM DUAL UNION ALL
SELECT 'D', 'C9', 4 FROM DUAL UNION ALL
SELECT 'D', 'C10', 5 FROM DUAL UNION ALL
SELECT 'D', 'C11', 1 FROM DUAL UNION ALL
SELECT 'D', 'C12', 2 FROM DUAL UNION ALL
SELECT 'D', 'C13', 3 FROM DUAL UNION ALL
SELECT 'D', 'C14', 4 FROM DUAL UNION ALL
SELECT 'D', 'C15', 5 FROM DUAL UNION ALL
SELECT 'E', 'C16', 3 FROM DUAL UNION ALL
SELECT 'E', 'C17', 2 FROM DUAL UNION ALL
SELECT 'E', 'C18', 3 FROM DUAL UNION ALL
SELECT 'E', 'C19', 4 FROM DUAL UNION ALL
SELECT 'F', 'C20', 6 FROM DUAL UNION ALL
SELECT 'F', 'C21', 2 FROM DUAL;
COMMIT;