Home » SQL & PL/SQL » SQL & PL/SQL » Filling values (Oracle Database 11g Enterprise Edition Release 11.2.0.4.0)
Filling values [message #643822] Mon, 19 October 2015 10:01 Go to next message
manubatham20
Messages: 566
Registered: September 2010
Location: Seattle, WA, USA
Senior Member

Hi,

Please help me with the below problem.
I am trying to fill blank values in zone column according to loc column using below query.

WITH temp
        AS (SELECT 'ABC' col1,
                   'BCD' col2,
                   1 seq,
                   NULL loc
              FROM DUAL
            UNION ALL
            SELECT 'ABC' col1,
                   'BCD' col2,
                   2 seq,
                   NULL loc
              FROM DUAL
            UNION ALL
            SELECT 'ABC' col1, 'BCD' col2, 3 seq, 1 loc FROM DUAL
            UNION ALL
            SELECT 'ABC' col1,
                   'BCD' col2,
                   4 seq,
                   NULL loc
              FROM DUAL
            UNION ALL
            SELECT 'ABC' col1, 'BCD' col2, 5 seq, 2 loc FROM DUAL
            UNION ALL
            SELECT 'ABC' col1,
                   'BCD' col2,
                   6 seq,
                   NULL loc
              FROM DUAL
            UNION ALL
            SELECT 'ABC' col1,
                   'BCD' col2,
                   6 seq,
                   NULL loc
              FROM DUAL
            UNION ALL
            SELECT 'ABC' col1,
                   'BCD' col2,
                   7 seq,
                   NULL loc
              FROM DUAL
            UNION ALL
            SELECT 'ABC' col1,
                   'BCD' col2,
                   8 seq,
                   NULL loc
              FROM DUAL
            UNION ALL
            SELECT 'ABC' col1, 'BCD' col2, 9 seq, 3 loc FROM DUAL)
SELECT col1,
       col2,
       seq,
       loc
       --,LAST_VALUE (
       --   loc)
       --OVER (PARTITION BY col1, col2
       --      ORDER BY seq
       --      RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
       --   zone
  FROM temp;


The requirement is, if we partition by col1 and col2 and sort by loc, I have to fill first available loc value in all preceding rows till the last loc.

The result should look like the image attached.

EDIT : because results in Quote was not indented properly, so replaced with an image.

Thanks,
Manu
  • Attachment: result.PNG
    (Size: 8.98KB, Downloaded 919 times)

[Updated on: Mon, 19 October 2015 10:06]

Report message to a moderator

Re: Filling values [message #643824 is a reply to message #643822] Mon, 19 October 2015 10:30 Go to previous messageGo to next message
Michel Cadot
Messages: 68776
Registered: March 2007
Location: Saint-Maur, France, https...
Senior Member
Account Moderator
SQL> WITH temp
  2          AS (SELECT 'ABC' col1,
  3                     'BCD' col2,
  4                     1 seq,
  5                     NULL loc
  6                FROM DUAL
  7              UNION ALL
  8              SELECT 'ABC' col1,
  9                     'BCD' col2,
 10                     2 seq,
 11                     NULL loc
 12                FROM DUAL
 13              UNION ALL
 14              SELECT 'ABC' col1, 'BCD' col2, 3 seq, 1 loc FROM DUAL
 15              UNION ALL
 16              SELECT 'ABC' col1,
 17                     'BCD' col2,
 18                     4 seq,
 19                     NULL loc
 20                FROM DUAL
 21              UNION ALL
 22              SELECT 'ABC' col1, 'BCD' col2, 5 seq, 2 loc FROM DUAL
 23              UNION ALL
 24              SELECT 'ABC' col1,
 25                     'BCD' col2,
 26                     6 seq,
 27                     NULL loc
 28                FROM DUAL
 29              UNION ALL
 30              SELECT 'ABC' col1,
 31                     'BCD' col2,
 32                     6 seq,
 33                     NULL loc
 34                FROM DUAL
 35              UNION ALL
 36              SELECT 'ABC' col1,
 37                     'BCD' col2,
 38                     7 seq,
 39                     NULL loc
 40                FROM DUAL
 41              UNION ALL
 42              SELECT 'ABC' col1,
 43                     'BCD' col2,
 44                     8 seq,
 45                     NULL loc
 46                FROM DUAL
 47              UNION ALL
 48              SELECT 'ABC' col1, 'BCD' col2, 9 seq, 3 loc FROM DUAL)
 49  select t.*,
 50         first_value(loc ignore nulls) over
 51           (partition by col1, col2 order by seq
 52            rows between current row and unbounded following)
 53           zone
 54  from temp t
 55  order by col1, col2, seq
 56  /
COL COL        SEQ        LOC       ZONE
--- --- ---------- ---------- ----------
ABC BCD          1                     1
ABC BCD          2                     1
ABC BCD          3          1          1
ABC BCD          4                     2
ABC BCD          5          2          2
ABC BCD          6                     3
ABC BCD          6                     3
ABC BCD          7                     3
ABC BCD          8                     3
ABC BCD          9          3          3

10 rows selected.

Re: Filling values [message #643825 is a reply to message #643824] Mon, 19 October 2015 10:40 Go to previous message
manubatham20
Messages: 566
Registered: September 2010
Location: Seattle, WA, USA
Senior Member

Thanks Michel.

Dumb me.
Previous Topic: user schema can't create or alter job (merged 3)
Next Topic: Insert into table from another table based on joining column
Goto Forum:
  


Current Time: Sat Jul 11 10:06:20 CDT 2026