Request: Help creating a difficult view.

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Dave Pylatuk

    Request: Help creating a difficult view.

    Hello all.

    I have a table defined in sql server as follows:

    ROW_ID (identity)
    DEPTH_FROM Number (8,3)
    DEPTH_TO Number (8,3)
    COLOUR Char(10)

    With typical data like:
    ROW_ID DEPTH_FROM DEPTH_TO COLOUR
    ---------------------------------------------------------------
    1 0 5
    BLUE
    2 5 8
    BLUE
    3 8 10
    RED
    4 10 12
    GREEN
    5 12 16
    GREEN

    I want to create a view that will 'compress/roll up' the data so
    it appears like:

    DEPTH_FROM DEPTH_TO COLOUR
    ---------------------------------------------------------
    0 8 BLUE
    8 10 RED
    10 16 GREEN

    I have been working on this for several days, with no luck,
    any help would be appreciated. BTW: there are no overlaps
    allowed in the depth_from, depth_to values.

    Thanks in advance.


  • David Portas

    #2
    Re: Request: Help creating a difficult view.

    I'll assume that the colours don't always occur at consecutive depths
    otherwise you could just do this:

    SELECT MIN(depth_from) , MAX(depth_to), colour
    FROM ColDepths
    GROUP BY colour


    Here's the (assumed) DDL and sample data. It helps if you include this with
    posts.

    CREATE TABLE ColDepths (row_id INTEGER NOT NULL UNIQUE, depth_from INTEGER
    NOT NULL, depth_to INTEGER NOT NULL, colour CHAR(10) NOT NULL,
    CHECK(depth_fro m<depth_to), PRIMARY KEY (depth_from,dep th_to))

    INSERT INTO ColDepths VALUES (1,0,5, 'BLUE')
    INSERT INTO ColDepths VALUES (2,5,8, 'BLUE')
    INSERT INTO ColDepths VALUES (3,8,10, 'RED')
    INSERT INTO ColDepths VALUES (4,10,12, 'GREEN')
    INSERT INTO ColDepths VALUES (5,12,16, 'GREEN')

    Here's my query.

    SELECT MIN(A.depth_fro m) AS depth_from,
    MAX(A.depth_to) AS depth_to, A.colour
    FROM ColDepths AS A
    JOIN
    (SELECT c1.row_id, MIN(C2.depth_to ) AS next_depth
    FROM ColDepths AS C1
    LEFT JOIN ColDepths AS C2
    ON C1.colour <> C2.colour
    AND (C1.depth_from < C2.depth_from
    OR (C1.depth_from = C2.depth_from)
    AND C1.depth_to <= C2.depth_to)
    GROUP BY c1.row_id) AS B
    ON A.row_id = B.row_id
    GROUP BY A.colour, B.next_depth

    --
    David Portas
    ------------
    Please reply only to the newsgroup
    --


    Comment

    • DHatheway

      #3
      Re: Request: Help creating a difficult view.

      Is this what you have in mind?

      create table foo
      (ROW_ID int, /* my datatypes vary from yours for my convenience
      */
      DEPTH_FROM int,
      DEPTH_TO int,
      COLOUR Char(10))
      go
      insert foo values (1,0,5,'blue')
      insert foo values (2,5,8,'blue')
      insert foo values (3,8,10,'red')
      insert foo values (4,10,12,'green ')
      insert foo values (5,12,16,'green ')
      go
      select min(depth_from) as depth_from, max(depth_to) as depth_to, colour
      from foo
      group by colour

      depth_from depth_to colour
      ----------- ----------- ----------
      0 8 blue
      10 16 green
      8 10 red

      (3 row(s) affected)

      You may want an ORDER BY clause, too. Order of rows returned with GROUP BY
      is not guaranteed/predictable.

      "Dave Pylatuk" <davep@centurys ystems.net> wrote in message
      news:pZgcb.4184 $1H3.311803@new s20.bellglobal. com...[color=blue]
      > Hello all.
      >
      > I have a table defined in sql server as follows:
      >
      > ROW_ID (identity)
      > DEPTH_FROM Number (8,3)
      > DEPTH_TO Number (8,3)
      > COLOUR Char(10)
      >
      > With typical data like:
      > ROW_ID DEPTH_FROM DEPTH_TO COLOUR
      > ---------------------------------------------------------------
      > 1 0 5
      > BLUE
      > 2 5 8
      > BLUE
      > 3 8 10
      > RED
      > 4 10 12
      > GREEN
      > 5 12 16
      > GREEN
      >
      > I want to create a view that will 'compress/roll up' the data so
      > it appears like:
      >
      > DEPTH_FROM DEPTH_TO COLOUR
      > ---------------------------------------------------------
      > 0 8 BLUE
      > 8 10 RED
      > 10 16 GREEN
      >
      > I have been working on this for several days, with no luck,
      > any help would be appreciated. BTW: there are no overlaps
      > allowed in the depth_from, depth_to values.
      >
      > Thanks in advance.
      >
      >[/color]


      Comment

      • Tom Leylan

        #4
        Re: Request: Help creating a difficult view.

        "Dave Pylatuk" <davep@centurys ystems.net> wrote...
        [color=blue]
        > I want to create a view that will 'compress/roll up' the data so
        > it appears like:
        >
        > DEPTH_FROM DEPTH_TO COLOUR
        > ---------------------------------------------------------
        > 0 8 BLUE
        > 8 10 RED
        > 10 16 GREEN[/color]

        I don't use SqlServer but... wouldn't this work?

        select min(depth_from) , max(depth_to), colour from <tablename> group by
        colour


        Comment

        • Dave Pylatuk

          #5
          Re: Request: Help creating a difficult view.

          Testing these suggestions right now, thanks to all

          "Dave Pylatuk" <davep@centurys ystems.net> wrote in message
          news:pZgcb.4184 $1H3.311803@new s20.bellglobal. com...[color=blue]
          > Hello all.
          >
          > I have a table defined in sql server as follows:
          >
          > ROW_ID (identity)
          > DEPTH_FROM Number (8,3)
          > DEPTH_TO Number (8,3)
          > COLOUR Char(10)
          >
          > With typical data like:
          > ROW_ID DEPTH_FROM DEPTH_TO COLOUR
          > ---------------------------------------------------------------
          > 1 0 5
          > BLUE
          > 2 5 8
          > BLUE
          > 3 8 10
          > RED
          > 4 10 12
          > GREEN
          > 5 12 16
          > GREEN
          >
          > I want to create a view that will 'compress/roll up' the data so
          > it appears like:
          >
          > DEPTH_FROM DEPTH_TO COLOUR
          > ---------------------------------------------------------
          > 0 8 BLUE
          > 8 10 RED
          > 10 16 GREEN
          >
          > I have been working on this for several days, with no luck,
          > any help would be appreciated. BTW: there are no overlaps
          > allowed in the depth_from, depth_to values.
          >
          > Thanks in advance.
          >
          >[/color]


          Comment

          • Shervin Shapourian

            #6
            Re: Request: Help creating a difficult view.

            Hi Dave,

            If there is no overlap but there can be gaps between intervals, this is the
            query you want:

            select DEPTH_FROM,
            DEPTH_TO = (select min(DEPTH_TO)
            from T T3
            where DEPTH_TO not in (select DEPTH_FROM
            from T T4
            where T3.COLOUR = T4.COLOUR
            and T3.DEPTH_FROM <>
            T4.DEPTH_FROM
            )
            and T3.DEPTH_TO > T1.DEPTH_FROM
            ),
            COLOUR
            from T T1
            where DEPTH_FROM not in (select DEPTH_TO
            from T T2
            where T1.COLOUR = T2.COLOUR
            and T1.DEPTH_FROM <> T2.DEPTH_FROM
            )
            order by DEPTH_FROM

            Good Luck,
            Shervin



            "Dave Pylatuk" <davep@centurys ystems.net> wrote in message
            news:pZgcb.4184 $1H3.311803@new s20.bellglobal. com...[color=blue]
            > Hello all.
            >
            > I have a table defined in sql server as follows:
            >
            > ROW_ID (identity)
            > DEPTH_FROM Number (8,3)
            > DEPTH_TO Number (8,3)
            > COLOUR Char(10)
            >
            > With typical data like:
            > ROW_ID DEPTH_FROM DEPTH_TO COLOUR
            > ---------------------------------------------------------------
            > 1 0 5
            > BLUE
            > 2 5 8
            > BLUE
            > 3 8 10
            > RED
            > 4 10 12
            > GREEN
            > 5 12 16
            > GREEN
            >
            > I want to create a view that will 'compress/roll up' the data so
            > it appears like:
            >
            > DEPTH_FROM DEPTH_TO COLOUR
            > ---------------------------------------------------------
            > 0 8 BLUE
            > 8 10 RED
            > 10 16 GREEN
            >
            > I have been working on this for several days, with no luck,
            > any help would be appreciated. BTW: there are no overlaps
            > allowed in the depth_from, depth_to values.
            >
            > Thanks in advance.
            >
            >[/color]


            Comment

            • John Gilson

              #7
              Re: Request: Help creating a difficult view.

              "Dave Pylatuk" <davep@centurys ystems.net> wrote in message
              news:pZgcb.4184 $1H3.311803@new s20.bellglobal. com...[color=blue]
              > Hello all.
              >
              > I have a table defined in sql server as follows:
              >
              > ROW_ID (identity)
              > DEPTH_FROM Number (8,3)
              > DEPTH_TO Number (8,3)
              > COLOUR Char(10)
              >
              > With typical data like:
              > ROW_ID DEPTH_FROM DEPTH_TO COLOUR
              > ---------------------------------------------------------------
              > 1 0 5
              > BLUE
              > 2 5 8
              > BLUE
              > 3 8 10
              > RED
              > 4 10 12
              > GREEN
              > 5 12 16
              > GREEN
              >
              > I want to create a view that will 'compress/roll up' the data so
              > it appears like:
              >
              > DEPTH_FROM DEPTH_TO COLOUR
              > ---------------------------------------------------------
              > 0 8 BLUE
              > 8 10 RED
              > 10 16 GREEN
              >
              > I have been working on this for several days, with no luck,
              > any help would be appreciated. BTW: there are no overlaps
              > allowed in the depth_from, depth_to values.
              >
              > Thanks in advance.[/color]

              This will also handle gaps between consecutive depth intervals.

              CREATE TABLE ColorDepths
              (
              depth_from INT NOT NULL PRIMARY KEY,
              depth_to INT NOT NULL,
              color CHAR(10) NOT NULL,
              CHECK (depth_from <= depth_to)
              )

              -- Your sample data augmented to better exercise code
              INSERT INTO ColorDepths (depth_from, depth_to, color)
              VALUES (0,5, 'BLUE')
              INSERT INTO ColorDepths (depth_from, depth_to, color)
              VALUES (5,8, 'BLUE')
              INSERT INTO ColorDepths (depth_from, depth_to, color)
              VALUES (8,10, 'RED')
              INSERT INTO ColorDepths (depth_from, depth_to, color)
              VALUES (11,12, 'GREEN')
              INSERT INTO ColorDepths (depth_from, depth_to, color)
              VALUES (12,15, 'GREEN')
              INSERT INTO ColorDepths (depth_from, depth_to, color)
              VALUES (16, 18, 'BLUE')
              INSERT INTO ColorDepths (depth_from, depth_to, color)
              VALUES (18, 24, 'BLUE')
              INSERT INTO ColorDepths (depth_from, depth_to, color)
              VALUES (26, 30, 'BLUE')

              -- Associate consecutive depth intervals with natural numbers
              CREATE VIEW OrderedColorDep ths (depth_from, depth_to, color, seq)
              AS
              SELECT D1.depth_from, D1.depth_to, D1.color, COUNT(*)
              FROM ColorDepths AS D1
              INNER JOIN
              ColorDepths AS D2
              ON D2.depth_from <= D1.depth_from
              GROUP BY D1.depth_from, D1.depth_to, D1.color

              -- Using above natural numbers, find endpoints
              CREATE VIEW ColorDepthEnds (color, seq)
              AS
              SELECT OD1.color, OD1.seq
              FROM OrderedColorDep ths AS OD1
              LEFT OUTER JOIN
              OrderedColorDep ths AS OD2
              ON OD2.seq = OD1.seq + 1
              WHERE OD2.color <> OD1.color OR -- consecutive depths w/ diff. colors
              OD2.color IS NULL OR -- last (greatest) depth
              OD2.depth_from > OD1.depth_to -- gap between consecutive depths

              SELECT color,
              MIN(depth_from) AS depth_from , MAX(depth_to) AS depth_to
              FROM (SELECT OD.color, OD.depth_from, OD.depth_to,
              MIN(DE.seq) AS seq
              FROM OrderedColorDep ths AS OD
              INNER JOIN
              ColorDepthEnds AS DE
              ON DE.seq >= OD.seq AND
              DE.color = OD.color
              GROUP BY OD.depth_from, OD.depth_to, OD.color) AS R
              GROUP BY seq, color
              ORDER BY depth_from

              color depth_from depth_to
              BLUE 0 8
              RED 8 10
              GREEN 11 15
              BLUE 16 24
              BLUE 26 30

              Regards,
              jag


              Comment

              Working...