Analytic query !!!!

Hi all,
I have the following table with the set of data. This is just a short version of the actual table. The actual table has around 13 million records.
CREATE TABLE MY_TEST_TABLE(ID NUMBER,KEY NUMBER,TYPEOFRECORD VARCHAR2(20BYTE),
MYDATE DATE);
Insert into MY_TEST_TABLE(ID, KEY, TYPEOFRECORD, MYDATE)
Values(6366556, 404887, 'GP', TO_DATE('07/23/2004 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into MY_TEST_TABLE(ID, KEY, TYPEOFRECORD, MYDATE)
Values
(6366516, 404887, 'GP', TO_DATE('07/23/2004 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into MY_TEST_TABLE(ID, KEY, TYPEOFRECORD, MYDATE)
Values
(6366565, 404887, 'GP', TO_DATE('07/23/2004 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into MY_TEST_TABLE(ID, KEY, TYPEOFRECORD, MYDATE)
Values
(6366568, 404887, 'GP', TO_DATE('07/23/2004 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into MY_TEST_TABLE(ID, KEY, TYPEOFRECORD, MYDATE)
Values
(7076940, 404887, 'CE', TO_DATE('11/04/2004 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into MY_TEST_TABLE(ID, KEY, TYPEOFRECORD, MYDATE)
Values
(18197564, 404887, 'CE', TO_DATE('08/29/2005 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into MY_TEST_TABLE(ID, KEY, TYPEOFRECORD, MYDATE)
Values
(17561339, 404887, 'CE', TO_DATE('05/05/2006 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into MY_TEST_TABLE(ID, KEY, TYPEOFRECORD, MYDATE)
Values
(18381063, 404887, 'CE', TO_DATE('05/19/2006 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into MY_TEST_TABLE(ID, KEY, TYPEOFRECORD, MYDATE)
Values
(18381260, 404887, 'CE', TO_DATE('06/09/2006 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into MY_TEST_TABLE(ID, KEY, TYPEOFRECORD, MYDATE)
Values
(18386869, 404887, 'CE', TO_DATE('06/10/2006 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into MY_TEST_TABLE(ID, KEY, TYPEOFRECORD, MYDATE)
Values
(18895620, 404887, 'CE', TO_DATE('06/10/2006 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into MY_TEST_TABLE(ID, KEY, TYPEOFRECORD, MYDATE)
Values
(17769950, 404887, 'CE', TO_DATE('05/06/2006 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into MY_TEST_TABLE(ID, KEY, TYPEOFRECORD, MYDATE)
Values
(18096803, 404887, 'CE', TO_DATE('05/19/2006 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into MY_TEST_TABLE(ID, KEY, TYPEOFRECORD, MYDATE)
Values
(18381262, 404887, 'CE', TO_DATE('06/09/2006 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into MY_TEST_TABLE(ID, KEY, TYPEOFRECORD, MYDATE)
Values
(18381270, 404887, 'CE', TO_DATE('06/09/2006 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
COMMIT;
My requirement is to get the highest ID value, TYPEOFRECORD value for a given key value. So I wrote this query:
select KEY, max(ID) over (partition by KEY) myid, TYPEOFRECORD
from MY_TEST_TABLE;
but this query returns as many number of records as there are records for a particular KEY value.
But if I write this query it gives the correct result:
select tt1.key,tt1.id,tt1.MYDATE,tt1.TYPEOFRECORD
from MY_TEST_TABLE tt1 where (tt1.KEY,tt1.ID) in
(select tt.KEY, max(tt.ID) myid
from MY_TEST_TABLE tt
group by tt.key)
What wrong I am doing in the analytic query.
Thanks
Vinayak

you should not look for analytic, but for aggregates :
select KEY, max(ID) id, max(TYPEOFRECORD) keep (dense_rank first order by id) typeofrecord
from MY_TEST_TABLE
group by key;
       KEY         ID TYPEOFRECORD
    404887   18895620 GPwith analytics, you can for each line get the max.
like in :
select KEY, id, TYPEOFRECORD, max(id) over (partition by key) maxid, 
max(TYPEOFRECORD) keep (dense_rank first order by id) over (partition by key) maxTYPEOFRECORD
from MY_TEST_TABLE;
       KEY         ID TYPEOFRECORD              MAXID MAXTYPEOFRECORD
    404887    6366556 GP                     18895620 GP
    404887   18381270 CE                     18895620 GP
    404887    6366565 GP                     18895620 GP
    404887    6366568 GP                     18895620 GP
    404887    7076940 CE                     18895620 GP
    404887   18197564 CE                     18895620 GP
    404887   17561339 CE                     18895620 GP
    404887   18381063 CE                     18895620 GP
    404887   18381260 CE                     18895620 GP
    404887   18386869 CE                     18895620 GP
    404887   18895620 CE                     18895620 GP
    404887   17769950 CE                     18895620 GP
    404887   18096803 CE                     18895620 GP
    404887   18381262 CE                     18895620 GP
    404887    6366516 GP                     18895620 GPok?

Similar Messages

  • Analytic query to select next record

    Hi all,
    I would like to query the below two table match to ouput.
    1.dev_wt 2.dev_map 3.Output Result
    To help more clearance please see this image link : http://lh6.ggpht.com/_xL6eBqjW6Yo/TEqnSvlF_FI/AAAAAAAAB0U/i2sclnnaj6g/Untitled-3.jpg
    1. dev_wt
    PMS_COMP     PMS_I       PMS_PERF_D   PMS_WT   PMS_CREATION_D
    BBOARD     GICEQGROSS    04/01/2001     30     04/05/2001
    BBOARD     GICST_B       04/01/2001     5      04/05/2001
    BBOARD     SBGS_B        04/01/2001     65     04/05/2001
    BBOARD     GICEQGROSS    04/11/2001     30     04/15/2001
    BBOARD     GICST_B       04/11/2001     5      04/15/2001
    BBOARD     SBGS_B        04/11/2001     65     04/15/20012. dev_map
    GS_CODE     GS_I_CODE    GS_I_ID  MD_ID   GS_START_DT    GS_END_DT
    GICEQGROSS   CIWL        304       15     01/04/1998     31/03/2004
    GICEQGROSS   CIWL        304       2     01/04/2004      31/03/9998
    GICST_B      GICST_B     3707      15     01/04/2000     31/12/9998
    SBGS_B       SBGS_B      2231      15     01/04/1992     30/09/2003
    SBGS_B       SBGS_B      564       15     01/10/2003     31/12/9998I would like to match PMS_I = GS_CODE to retrieve GS_I_CODE and using analytic
    query to find next record.
    Because I need to select GICEQGROSS record of PMS_PERF_D date and next
    GICEQGROSS record of PMS_PERF_D from dev_wt table and put GS_WT_FR and GS_WT_TO of Output result.
    ***Date is change to YYYYMMDD format
    ***PMS_WT is devided by 100
    *3. Output Result*
    GS_I_ID    PMS_COMP     GS_I_CODE     GS_WT_FR     GS_WT_TO     GS_I_CALC
    304       BBOARD        CIWL          20010401     20010410     0.3
    3707      BBOARD        GICST_B       20010401     20010410     0.05
    5209      BBOARD        SBGS_B        20010401     20010410     0.65PMS_COMP is from dev_wt table
    GS_I_CODE is from dev_map table join with dev_wt
    GS_WT_FR is from dev_wt table of GS_START_DT
    GS_WT_TO is from dev_wt table of next record GS_START_DT where PMS_I ='GICEQGROSS'
    Now my difficulty is to select next record of PMS_PERF_D using analytic query. Below
    is my query...
    SELECT GS_I_ID, PMS_COMP, GS_I_CODE, GS_WT_FR, GS_WT_TO, GS_I_CALC
    FROM dev_wt (
    SELECT lead(PMS_PERF_D) over(partition by PMS_I order by PMS_PERF_D) as GS_WT_TO       
    FROM dev_wt where PMS_I ='GICEQGROSS')
    left join dev_map on PMS_I = GS_CODE ;Thanks
    Edited by: WinZone on Jul 24, 2010 4:46 PM
    Edited by: WinZone on Jul 24, 2010 4:50 PM

    Hi,
    This query should be fine:
    SELECT DISTINCT t2.gs_i_id, pms_comp, t2.gs_i_code,
                    TO_CHAR
                       (MIN (pms_perf_d) OVER (PARTITION BY pms_comp, pms_i),
                        'yyyymmdd'
                       ) gs_wt_fr,
                    TO_CHAR
                       (MAX (pms_perf_d) OVER (PARTITION BY pms_comp, pms_i) - 1,
                        'yyyymmdd'
                       ) gs_wt_to,
                    pms_wt / 100 gs_i_calc
               FROM dev_wt t1, dev_map t2
              WHERE t2.gs_code = t1.pms_iREM Same remark as odie: should be "2231" instead ...

  • Hierarchical + Analytical query for organizational unit parameters

    Hello gurus,
    I try for a couples of hour ago to make a query work as I would like.
    Our application need to store some parameters for our organization units. These organization units are typically organized in in an hierarchy manner: one top unit with many level of child units. The parameters are stored into another table with 1:1 relationship.
    For sake of visualisation, here is the data for the organization unit and parameter table in a more visual format:
    SQL> select * from organization_unit;
    UNIT_CODE  UNIT_NAME            PARENT_UNIT_CODE
    00000      Top level
    10         L2 unit #10          00000
    10-01      L3 unit #10-01       10
    10-02      L3 unit #10-02       10
    20         L2 unit #20          00000
    20-01      L3 unit #20-01       20
    20-02      L3 unit #20-02       20
    SQL>  select * from org_unit_parameters;
    UNIT_CODE  PARAM1               PARAM2               PARAM3               PARAM4
    00000      Default value        Default value        Default value        {null}
    10         {null}               Value from 10        Value from 10        {null}
    10-01      {null}               {null}               Value from 10-01     {null}
    10-02      {null}               {null}               {null}               Value from 10-02
    20         Value from 20        Value from 20        Value from 20        {null}
    20-01      {null}               Value from 20-01     {null}               {null}
    20-02      {null}               Value from 20-02     {null}               {null}The application will query the parameter table to get a parameter value for a given unit.
    The parameter resolution algorithm is rather simple: when querying a unit, the applicable parameter is the one defined at the requested level. If the parameter is not defined (null) at the requested level, the parameter value that must be returned is the next defined one in the parent hierarchy. In some rare cases, it can be null if a parameter is not defined anywhere from the requested level to top.
    I've made a query that seems to work when querying for one unit at a time. It use hierarchical operators (start with + connect by) with a bit of analytical functions. Here is a test & raw output example:
    SQL> WITH hierarchy
      2  AS
      3  (
      4    SELECT ou.unit_code,
      5         LEVEL            AS lvl
      6    FROM   organization_unit ou
      7    START WITH
      8      ou.unit_code = '20-01'
      9    CONNECT BY
    10      ou.unit_code = PRIOR ou.parent_unit_code
    11  )
    12  SELECT h.*,
    13       p.param1                                                        AS param1_raw,
    14       LAST_VALUE (p.param1 IGNORE NULLS) OVER (ORDER BY h.lvl DESC)   AS param1_with_last,
    15       FIRST_VALUE(p.param1 IGNORE NULLS) OVER (ORDER BY h.lvl ASC)    AS param1_with_first,
    16       p.param2                                                        AS param2_raw,
    17       LAST_VALUE (p.param2 IGNORE NULLS) OVER (ORDER BY h.lvl DESC)   AS param2_with_last,
    18       FIRST_VALUE(p.param2 IGNORE NULLS) OVER (ORDER BY h.lvl ASC)    AS param2_with_first,
    19       p.param3                                                        AS param3_raw,
    20       LAST_VALUE (p.param3 IGNORE NULLS) OVER (ORDER BY h.lvl DESC)   AS param3_with_last,
    21       FIRST_VALUE(p.param3 IGNORE NULLS) OVER (ORDER BY h.lvl ASC)    AS param3_with_first,
    22       p.param4                                                        AS param4_raw,
    23       LAST_VALUE (p.param4 IGNORE NULLS) OVER (ORDER BY h.lvl DESC)   AS param4_with_last,
    24       FIRST_VALUE(p.param4 IGNORE NULLS) OVER (ORDER BY h.lvl ASC)    AS param4_with_first
    25  FROM   hierarchy                                h
    26         LEFT JOIN org_unit_parameters         p
    27         ON h.unit_code = p.unit_code
    28  ORDER BY h.lvl DESC;
    UNIT_CODE   LVL PARAM1_RAW           PARAM1_WITH_LAST     PARAM1_WITH_FIRST    PARAM2_RAW           PARAM2_WITH_LAST     PARAM2_WITH_FIRST    PARAM3_RAW           PARAM3_WITH_LAST     PARAM3_WITH_FIRST    PARAM4_RAW           PARAM4_WITH_LAST     PARAM4_WITH_FIRST
    00000         3 Default value        Default value        Value from 20        Default value        Default value        Value from 20-01     Default value        Default value        Value from 20        {null}               {null}               {null}
    20            2 Value from 20        Value from 20        Value from 20        Value from 20        Value from 20        Value from 20-01     Value from 20        Value from 20        Value from 20        {null}               {null}               {null}
    20-01         1 {null}               Value from 20        {null}               Value from 20-01     Value from 20-01     Value from 20-01     {null}               Value from 20        {null}               {null}               {null}               {null}Seems pretty good, the upper parameters are well «propagated» down with LAST_VALUE function. But, I don't understand why the use of FIRST_VALUE and oppposite ordering doesn't give the same result. A little more playing with the last query for getting the final result for a given unit code:
    SQL> SELECT *
      2  FROM
      3  (
      4     WITH hierarchy
      5     AS
      6     (
      7        SELECT ou.unit_code,
      8               LEVEL            AS lvl
      9        FROM   organization_unit ou
    10        START WITH
    11           ou.unit_code = '20-01'
    12        CONNECT BY
    13           ou.unit_code = PRIOR ou.parent_unit_code
    14     )
    15     SELECT h.*,
    16            LAST_VALUE (p.param1 IGNORE NULLS) OVER (ORDER BY h.lvl DESC)   AS param1,
    17            LAST_VALUE (p.param2 IGNORE NULLS) OVER (ORDER BY h.lvl DESC)   AS param2,
    18            LAST_VALUE (p.param3 IGNORE NULLS) OVER (ORDER BY h.lvl DESC)   AS param3,
    19            LAST_VALUE (p.param4 IGNORE NULLS) OVER (ORDER BY h.lvl DESC)   AS param4
    20     FROM   hierarchy                                h
    21               LEFT JOIN org_unit_parameters         p
    22               ON h.unit_code = p.unit_code
    23     ORDER BY h.lvl
    24  )
    25  WHERE ROWNUM = 1;
    UNIT_CODE   LVL PARAM1               PARAM2               PARAM3               PARAM4
    20-01         1 Value from 20        Value from 20-01     Value from 20        {null}Works well!
    But, my ultimate goal is to create a view that resolve correctly all these parameters for each level of the organization with proper propagation rather then querying for each unit at a time. I played a bit, but without success. :( My current raw query is this one:
    SQL> WITH hierarchy
      2  AS
      3  (
      4     SELECT ou.unit_code,
      5            LPAD(' ',2*(LEVEL-1)) || ou.unit_code    AS tree,
      6            LEVEL                                    AS lvl
      7     FROM   organization_unit ou
      8     START WITH
      9        parent_unit_code IS NULL
    10     CONNECT BY
    11        PRIOR unit_code =  parent_unit_code
    12  )
    13  SELECT h.*,
    14         p.param1                                                        AS param1_raw,
    15         LAST_VALUE (p.param1 IGNORE NULLS) OVER (ORDER BY h.lvl DESC)   AS param1_with_last,
    16         FIRST_VALUE(p.param1 IGNORE NULLS) OVER (ORDER BY h.lvl ASC)    AS param1_with_first,
    17         p.param2                                                        AS param2_raw,
    18         LAST_VALUE (p.param2 IGNORE NULLS) OVER (ORDER BY h.lvl DESC)   AS param2_with_last,
    19         FIRST_VALUE(p.param2 IGNORE NULLS) OVER (ORDER BY h.lvl ASC)    AS param2_with_first,
    20         p.param3                                                        AS param3_raw,
    21         LAST_VALUE (p.param3 IGNORE NULLS) OVER (ORDER BY h.lvl DESC)   AS param3_with_last,
    22         FIRST_VALUE(p.param3 IGNORE NULLS) OVER (ORDER BY h.lvl ASC)    AS param3_with_first,
    23         p.param4                                                        AS param4_raw,
    24         LAST_VALUE (p.param4 IGNORE NULLS) OVER (ORDER BY h.lvl DESC)   AS param4_with_last,
    25         FIRST_VALUE(p.param4 IGNORE NULLS) OVER (ORDER BY h.lvl ASC)    AS param4_with_first
    26  FROM   hierarchy                          h
    27            LEFT JOIN org_unit_parameters   p
    28            ON h.unit_code = p.unit_code
    29  ORDER BY h.unit_code;
    UNIT_CODE  TREE        LVL PARAM1_RAW                PARAM1_WITH_LAST          PARAM1_WITH_FIRST      PARAM2_RAW                   PARAM2_WITH_LAST          PARAM2_WITH_FIRST         PARAM3_RAW                PARAM3_WITH_LAST          PARAM3_WITH_FIRST         PARAM4_RAW                PARAM4_WITH_LAST       PARAM4_WITH_FIRST
    00000      00000         1 Default value             Default value             Default value          Default value                Default value             Default value             Default value             Default value             Default value             {null}                    Value from 10-02       {null}
    10           10          2 {null}                    Value from 20             Default value          Value from 10                Value from 10             Default value             Value from 10             Value from 10             Default value             {null}                    Value from 10-02       {null}
    10-01          10-01     3 {null}                    {null}                    Default value          {null}                       Value from 20-02          Default value             Value from 10-01          Value from 10-01          Default value             {null}                    Value from 10-02       Value from 10-02
    10-02          10-02     3 {null}                    {null}                    Default value          {null}                       Value from 20-02          Default value             {null}                    Value from 10-01          Default value             Value from 10-02          Value from 10-02       Value from 10-02
    20           20          2 Value from 20             Value from 20             Default value          Value from 20                Value from 10             Default value             Value from 20             Value from 10             Default value             {null}                    Value from 10-02       {null}
    20-01          20-01     3 {null}                    {null}                    Default value          Value from 20-01             Value from 20-02          Default value             {null}                    Value from 10-01          Default value             {null}                    Value from 10-02       Value from 10-02
    20-02          20-02     3 {null}                    {null}                    Default value          Value from 20-02             Value from 20-02          Default value             {null}                    Value from 10-01          Default value             {null}                    Value from 10-02       Value from 10-02As you can see, it's not as I expected. I know there's something to do with a PARTITION BY clause, but don't know how.
    Is anyone knows how to solve my problem?
    Thanks
    Bruno
    For reproductibility purposes, here is the code to create sturcture and data:
    Here is the format of my tables and some samble data:
    CREATE TABLE organization_unit (
       unit_code         VARCHAR2(5 CHAR)   NOT NULL PRIMARY KEY,
       unit_name         VARCHAR2(100 CHAR) NOT NULL,
       parent_unit_code  VARCHAR2(5 CHAR)  
    CREATE TABLE org_unit_parameters (
       unit_code         VARCHAR2(5 CHAR)   NOT NULL PRIMARY KEY,
       param1            VARCHAR2(100 CHAR),
       param2            VARCHAR2(100 CHAR),
       param3            VARCHAR2(100 CHAR),
       param4            VARCHAR2(100 CHAR)
    -- Inserting data
    INSERT INTO organization_unit (unit_code, unit_name, parent_unit_code)
    VALUES ('00000', 'Top level', NULL);
    INSERT INTO organization_unit (unit_code, unit_name, parent_unit_code)
    VALUES ('10', 'L2 unit #10', '00000');
    INSERT INTO organization_unit (unit_code, unit_name, parent_unit_code)
    VALUES ('10-01', 'L3 unit #10-01', '10');
    INSERT INTO organization_unit (unit_code, unit_name, parent_unit_code)
    VALUES ('10-02', 'L3 unit #10-02', '10');
    INSERT INTO organization_unit (unit_code, unit_name, parent_unit_code)
    VALUES ('20', 'L2 unit #20', '00000');
    INSERT INTO organization_unit (unit_code, unit_name, parent_unit_code)
    VALUES ('20-01', 'L3 unit #20-01', '20');
    INSERT INTO organization_unit (unit_code, unit_name, parent_unit_code)
    VALUES ('20-02', 'L3 unit #20-02', '20');
    INSERT INTO ORG_UNIT_PARAMETERS (unit_code, param1, param2, param3)
    VALUES ('00000', 'Default value', 'Default value', 'Default value');
    INSERT INTO ORG_UNIT_PARAMETERS (unit_code, param2, param3)
    VALUES ('10', 'Value from 10', 'Value from 10');
    INSERT INTO ORG_UNIT_PARAMETERS (unit_code, param3)
    VALUES ('10-01', 'Value from 10-01');
    INSERT INTO ORG_UNIT_PARAMETERS (unit_code, param4)
    VALUES ('10-02', 'Value from 10-02');
    INSERT INTO ORG_UNIT_PARAMETERS (unit_code, param1, param2, param3)
    VALUES ('20', 'Value from 20', 'Value from 20', 'Value from 20');
    INSERT INTO ORG_UNIT_PARAMETERS (unit_code, param2)
    VALUES ('20-01', 'Value from 20-01');
    INSERT INTO ORG_UNIT_PARAMETERS (unit_code, param2)
    VALUES ('20-02', 'Value from 20-02');
    COMMIT;

    Now, I hoppe I got your reqs:
    WITH hierarchy AS (
                       SELECT  ou.unit_code,
                               LPAD(' ',2*(LEVEL-1)) || ou.unit_code    AS tree,
                               LEVEL                                    AS lvl,
                               param1                                   AS param1_raw,
                               param2                                   AS param2_raw,
                               param3                                   AS param3_raw,
                               param4                                   AS param4_raw,
                               SYS_CONNECT_BY_PATH(p.param1,'#') || '#' AS param1_path,
                               SYS_CONNECT_BY_PATH(p.param2,'#') || '#' AS param2_path,
                               SYS_CONNECT_BY_PATH(p.param3,'#') || '#' AS param3_path,
                               SYS_CONNECT_BY_PATH(p.param4,'#') || '#' AS param4_path
                         FROM  organization_unit ou LEFT JOIN org_unit_parameters p
                                 ON ou.unit_code = p.unit_code
                         START WITH parent_unit_code IS NULL
                         CONNECT BY PRIOR ou.unit_code =  parent_unit_code
    SELECT  unit_code,
            tree,
            lvl,
            param1_raw,
            REGEXP_SUBSTR(param1_path,'[^#]+',1,GREATEST(1,REGEXP_COUNT(param1_path,'[^#]+'))) AS param1_with_last,
            REGEXP_SUBSTR(param1_path,'[^#]+')                                                 AS param1_with_first,
            param2_raw,
            REGEXP_SUBSTR(param2_path,'[^#]+',1,GREATEST(1,REGEXP_COUNT(param2_path,'[^#]+'))) AS param2_with_last,
            REGEXP_SUBSTR(param2_path,'[^#]+')                                                 AS param2_with_first,
            param3_raw,
            REGEXP_SUBSTR(param3_path,'[^#]+',1,GREATEST(1,REGEXP_COUNT(param3_path,'[^#]+'))) AS param3_with_last,
            REGEXP_SUBSTR(param3_path,'[^#]+')                                                 AS param3_with_first,
            param4_raw,
            REGEXP_SUBSTR(param4_path,'[^#]+',1,GREATEST(1,REGEXP_COUNT(param4_path,'[^#]+'))) AS param4_with_last,
            REGEXP_SUBSTR(param4_path,'[^#]+')                                                 AS param4_with_first
      FROM  hierarchy
      ORDER BY unit_code
    UNIT_ TREE              LVL PARAM1_RAW       PARAM1_WITH_LAST PARAM1_WITH_FIRS PARAM2_RAW       PARAM2_WITH_LAST PARAM2_WITH_FIRS PARAM3_RAW       PARAM3_WITH_LAST PARAM3_WITH_FIRS PARAM4_RAW       PARAM4_WITH_LAST PARAM4_WITH_FIRS
    00000 00000               1 Default value    Default value    Default value    Default value    Default value    Default value    Default value    Default value    Default value
    10      10                2                  Default value    Default value    Value from 10    Value from 10    Default value    Value from 10    Value from 10    Default value
    10-01     10-01           3                  Default value    Default value                     Value from 10    Default value    Value from 10-01 Value from 10-01 Default value
    10-02     10-02           3                  Default value    Default value                     Value from 10    Default value                     Value from 10    Default value    Value from 10-02 Value from 10-02 Value from 10-02
    20      20                2 Value from 20    Value from 20    Default value    Value from 20    Value from 20    Default value    Value from 20    Value from 20    Default value
    20-01     20-01           3                  Value from 20    Default value    Value from 20-01 Value from 20-01 Default value                     Value from 20    Default value
    20-02     20-02           3                  Value from 20    Default value    Value from 20-02 Value from 20-02 Default value                     Value from 20    Default value
    7 rows selected.
    SQL>  SY.
    Edited by: Solomon Yakobson on Nov 12, 2010 10:09 AM

  • A question related to analytic query

    Supposed I have a table with three columns: class, name, and score and something like below:
    class Name score
    c1 n1 76
    c1 n2 92
    c1 n3 37
    c1 n4 50
    c1 n5 87
    c2 n6 97
    c2 n7 85
    c2 n8 61
    c2 n9 88
    c3 n10 85
    I want to have the summary report based on the percentage distribution like (0%~30%, 31%~70%, 71%~100%). The result I want to generate is something like
    class percentCategroy avg_score
    c1 0%~30% 57
    c1 31%~70% 88
    c1 70%~100% 92
    c3 0%~100% 85
    Note: the avg_score for c1 are not the correct one and just use some dummy number.
    Does anyone know how to write a query like above? Thank you very much in advance.

    I was thinking something like this:
    SELECT class,
      CASE
        WHEN score >= top_third
        THEN '66-100%'
        WHEN (score < top_third
        AND score  >= middle_third)
        THEN '33-66%'
        ELSE '0-33%'
      END pct_category,
      AVG(score) avg_score
       FROM
      (SELECT class                                               ,
        max_score                                                 ,
        min_score                                                 ,
        score                                                     ,
        ROUND((max_score - min_score)/3) * 2 + min_score top_third,
        ROUND((max_score - min_score)/3) + min_score middle_third
         FROM
        (SELECT class                                   ,
          MAX(score) over (partition BY class) max_score,
          MIN(score) over (partition BY class) min_score,
          score
           FROM t1
    GROUP BY class,
      CASE
        WHEN score >= top_third
        THEN '66-100%'
        WHEN (score < top_third
        AND score  >= middle_third)
        THEN '33-66%'
        ELSE '0-33%'
      END
    ORDER BY 1,2;
    CLASS      PCT_CATEGORY AVG_SCORE             
    c1         0-33%        43.5                  
    c1         66-100%      85                    
    c2         0-33%        61                    
    c2         66-100%      90                    
    c3         66-100%      85                    
    5 rows selectedThat NTILE analytic function looks promissing as well.
    Message was edited by:
    JoeC

  • Question related to analytic query

    Just realize I should post this question in this forum rather than regular SQL and PL/SQL topic.
    Supposed I have a table with three columns: class, name, and score and something like below:
    class Name score
    c1 n1 76
    c1 n2 92
    c1 n3 37
    c1 n4 50
    c1 n5 87
    c2 n6 97
    c2 n7 85
    c2 n8 61
    c2 n9 88
    c3 n10 85
    I want to have the summary report based on the percentage distribution like (0%~30%, 31%~70%, 71%~100%). The result I want to generate is something like
    class percentCategroy avg_score
    c1 0%~30% 57
    c1 31%~70% 88
    c1 70%~100% 92
    c3 0%~100% 85
    Note: the avg_score for c1 are not the correct one and just use some dummy number.
    Does anyone know how to write a query like above? Thank you very much in advance.

    I was thinking something like this:
    SELECT class,
      CASE
        WHEN score >= top_third
        THEN '66-100%'
        WHEN (score < top_third
        AND score  >= middle_third)
        THEN '33-66%'
        ELSE '0-33%'
      END pct_category,
      AVG(score) avg_score
       FROM
      (SELECT class                                               ,
        max_score                                                 ,
        min_score                                                 ,
        score                                                     ,
        ROUND((max_score - min_score)/3) * 2 + min_score top_third,
        ROUND((max_score - min_score)/3) + min_score middle_third
         FROM
        (SELECT class                                   ,
          MAX(score) over (partition BY class) max_score,
          MIN(score) over (partition BY class) min_score,
          score
           FROM t1
    GROUP BY class,
      CASE
        WHEN score >= top_third
        THEN '66-100%'
        WHEN (score < top_third
        AND score  >= middle_third)
        THEN '33-66%'
        ELSE '0-33%'
      END
    ORDER BY 1,2;
    CLASS      PCT_CATEGORY AVG_SCORE             
    c1         0-33%        43.5                  
    c1         66-100%      85                    
    c2         0-33%        61                    
    c2         66-100%      90                    
    c3         66-100%      85                    
    5 rows selectedThat NTILE analytic function looks promissing as well.
    Message was edited by:
    JoeC

  • Facing problem in implementing the analytical query in OWB

    Hi All,
    I was trying analytical function for my Customer Dimension but am not able to implement the same in my OWB.I have 2 tables who have duplicates customers which cannot be figured out by Customer id as customer id is not unique.So, i have to filter out the information on the basis of First Name, middle name, last name & DOB. Since, each customer has multiple address records( for Permanent, Correspondence, Unknown ).
    I want 1 record for all the three address types.
    Can i do thru the following query???
    If yes, how will i implment the same in OWB.
    SELECT PRENOM, MIDDLE_NAME, NOM, DEBUT, SEXE, OCCUPATION, FAMILY_STATUS,
         EDUC_QUALIFICATION, CUSTOMER_NATIONALITY, SIGLE, ANNUAL_INCOME,
         FATHER_HUSBAND_NAME,TYPE_ADDRESS, ADDRESS1, ADDRESS2, ADDRESS3,
         TOWN, REGION, POSTCODE,ADDRESS_EFFECT_DATE
    FROM
    (SELECT C1.PRENOM, C1.MIDDLE_NAME, C1.NOM, C1.DEBUT, C1.SEXE, C1.OCCUPATION, C1.FAMILY_STATUS,
         C1.EDUC_QUALIFICATION, C1.CUSTOMER_NATIONALITY, C1.SIGLE, C1.ANNUAL_INCOME,
         C1.FATHER_HUSBAND_NAME,C1.TYPE_ADDRESS, C1.ADDRESS1, C1.ADDRESS2, C1.ADDRESS3,
         C1.TOWN, C1.REGION, C1.POSTCODE,C1.ADDRESS_EFFECT_DATE,
    ROW_NUMBER() OVER (PARTITION BY C1.PRENOM, C1.MIDDLE_NAME, C1.NOM, C1.DEBUT,C1.TYPE_ADDRESS
    ORDER BY C1.ADDRESS_EFFECT_DATE DESC)M
    FROM CUST_1 C1
    UNION ALL
    SELECT C1.PR_FIRST_NM, C1.PR_MIDDLE_NM, C1.PR_LAST_NM, C1.PR_DOB, C1.PR_GENDER, C1.PR_OCCUPATION, C1.PR_MARITAL_STATUS,
    C1.PR_EDUCATION_QUAL, C1.PR_NATIONALITY, C1.PR_TITLE, C1.GP_ANNUAL_INC, C1.PR_FATHER_NM,
    C1.AD_TYPE, C1.AD_ADDR1, C1.AD_ADDR2, C1.AD_ADDR3, C1.TOWN, C1.REGION, C1.AD_PIN_CD,C1.REC_UPDT_DT,
    ROW_NUMBER() OVER (PARTITION BY C1.PR_FIRST_NM, C1.PR_MIDDLE_NM, C1.PR_LAST_NM, C1.PR_DOB,C1.AD_TYPE
    ORDER BY C1.REC_UPDT_DT DESC )M
    FROM CUST_2 C1)
    WHERE M = 1
    Please help me out as right now, am using aggregators which are taking lot of time. Loading type on my Customer Dimension table is- Insert/Update
    Thanks in advance
    -Nikita.

    Hello Nikita,
    From your first post I understand that you would like to merge 3 similar (but not complete identical) records into 1 record. If this is the case, then have you thought about using the match-merge operator in OWB?
    With the match-merge operator you can tell the mapping which records are similar by selecting "first_nm", "middle_nm", "last_nm" in the Match-Bin of the operator.
    Then you define how attributes should be merged.
    This way you do not need to aggregate your source data set. Just select all records from both source tables. Put those in the Set-Operator "UNION ALL" and this will be you input for the match-merge operator.
    Regards,
    Ilona

  • Looking for a proper analytical query/solution for below data

    I have data as shown below:
    mob_id     status_code     status_text     media_date
    39585     600     Online     04-Aug-09
    54988     600     Online     05-Aug-09
    39585     600     Online     05-Aug-09
    39585     600     Online     06-Aug-09
    39585     600     Online     07-Aug-09
    39585     600     Online     08-Aug-09
    39585     600     Online     09-Aug-09
    39585     600     Online     10-Aug-09
    39585     600     Online     11-Aug-09
    39585     600     Online     12-Aug-09
    39585     600     Online     13-Aug-09
    39585     600     Online     14-Aug-09
    39585     600     Online     15-Aug-09
    39585     600     Online     16-Aug-09
    39585     700     Deinstall     17-Aug-09
    54988     600     Online     06-Aug-09
    54988     600     Online     07-Aug-09
    54988     600     Online     08-Aug-09
    54988     600     Online     09-Aug-09
    54988     600     Online     10-Aug-09
    54988     600     Online     11-Aug-09
    54988     600     Online     12-Aug-09
    54988     600     Online     13-Aug-09
    54988     600     Online     14-Aug-09
    54988     600     Online     15-Aug-09
    54988     600     Online     16-Aug-09
    39585     600     Online     20-Aug-09
    39585     600     Online     21-Aug-09
    39585     600     Online     22-Aug-09
    39585     600     Online     23-Aug-09
    39585     600     Online     24-Aug-09
    39585     600     Online     25-Aug-09
    39585     700     Deinstall     26-Aug-09
    39585     600     Online     27-Aug-09
    39585     600     Online     28-Aug-09
    39585     600     Online     29-Aug-09
    39585     600     Online     30-Aug-09
    39585     600     Online     31-Aug-09
    39585     600     Online     01-Sep-09
    39585     700     Deinstall     02-Sep-09
    54988     600     Online     17-Aug-09
    54988     600     Online     18-Aug-09
    54988     600     Online     19-Aug-09
    54988     600     Online     20-Aug-09
    54988     600     Online     21-Aug-09
    54988     600     Online     22-Aug-09
    54988     600     Online     23-Aug-09
    54988     600     Online     24-Aug-09
    54988     600     Online     25-Aug-09
    54988     700     Deinstall     26-Aug-09
    69875     600     Online     20-Aug-09
    69875     600     Online     21-Aug-09
    69875     600     Online     22-Aug-09
    69875     600     Online     23-Aug-09
    69875     600     Online     24-Aug-09
    69875     600     Online     25-Aug-09
    69875     600     Online     26-Aug-09
    Using the above data I need to find out the below result set. Can any one help in this?
    occurrnace_seq     mob_id     start_media_date     end_media_date     no_of_days
    1     39585     04-Aug-09     17-Aug-09     13
    2     39585     20-Aug-09     26-Aug-09     6
    3     39585     27-Aug-09     02-Sep-09     6
    1     54988     05-Aug-09     26-Aug-09     21
    1     69875     20-Aug-09          null null
    Here start_media_date can be found with status_code=600 & end_media_date can be found with status_code=700.
    Please look that the mobility_id is starting multiple times.
    Any one can help me in producing this result using SQL or PL/SQL.
    Many thanks in advance.
    Thanks
    Guttiwas

    guttis wrote:
    Can I run this query on a 70 million records? Does it raise any performance problems. If you have any idea, just thorough some possible suggestions to protect such isses.Well, you can certailny run it on 70 million records. How long it will run depends on your hardware, Oracle and OS settings. Said that, there is a simpler solution:
    select  occurrenace_seq,
            mob_id,
            min(case grp when 'start-of-group' then media_date end) start_media_date,
            max(case grp when 'end-of-group' then media_date end) end_media_date,
            max(case grp when 'end-of-group' then media_date end) - min(case grp when 'start-of-group' then media_date end) no_of_days
      from  (
             select  t.*,
                     case
                       when status_text = 'Deinstall' then 'end-of-group'
                       when lag(status_text,1,'Deinstall') over(partition by mob_id order by media_date) = 'Deinstall' then 'start-of-group'
                     end grp,
                     sum(case status_text when 'Deinstall' then 1 else 0 end) over(partition by mob_id order by media_date) +
                     case lag(status_text,1,'Deinstall') over(partition by mob_id order by media_date) when 'Deinstall' then 1 else 0 end occurrenace_seq
               from  your_table t
      where grp in ('start-of-group','end-of-group')
      group by mob_id,
               occurrenace_seq
      order by mob_id,
               occurrenace_seq
    /With your sample:
    with t as (
               select 39585 mob_id,600 status_code,'Online' status_text, to_date('04-Aug-09','dd-mon-yy') media_date from dual union all
               select 54988,600,'Online',to_date('05-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('05-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('06-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('07-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('08-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('09-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('10-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('11-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('12-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('13-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('14-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('15-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('16-Aug-09','dd-mon-yy') from dual union all
               select 39585,700,'Deinstall', to_date('17-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('06-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('07-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('08-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('09-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('10-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('11-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('12-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('13-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('14-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('15-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('16-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('20-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('21-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('22-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('23-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('24-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('25-Aug-09','dd-mon-yy') from dual union all
               select 39585,700,'Deinstall', to_date('26-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('27-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('28-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('29-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('30-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('31-Aug-09','dd-mon-yy') from dual union all
               select 39585,600,'Online',to_date('01-Sep-09','dd-mon-yy') from dual union all
               select 39585,700,'Deinstall', to_date('02-Sep-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('17-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('18-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('19-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('20-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('21-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('22-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('23-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('24-Aug-09','dd-mon-yy') from dual union all
               select 54988,600,'Online',to_date('25-Aug-09','dd-mon-yy') from dual union all
               select 54988,700,'Deinstall', to_date('26-Aug-09','dd-mon-yy') from dual union all
               select 69875,600,'Online',to_date('20-Aug-09','dd-mon-yy') from dual union all
               select 69875,600,'Online',to_date('21-Aug-09','dd-mon-yy') from dual union all
               select 69875,600,'Online',to_date('22-Aug-09','dd-mon-yy') from dual union all
               select 69875,600,'Online',to_date('23-Aug-09','dd-mon-yy') from dual union all
               select 69875,600,'Online',to_date('24-Aug-09','dd-mon-yy') from dual union all
               select 69875,600,'Online',to_date('25-Aug-09','dd-mon-yy') from dual union all
               select 69875,600,'Online',to_date('26-Aug-09','dd-mon-yy') from dual
    select  occurrenace_seq,
            mob_id,
            min(case grp when 'start-of-group' then media_date end) start_media_date,
            max(case grp when 'end-of-group' then media_date end) end_media_date,
            max(case grp when 'end-of-group' then media_date end) - min(case grp when 'start-of-group' then media_date end) no_of_days
      from  (
             select  t.*,
                     case
                       when status_text = 'Deinstall' then 'end-of-group'
                       when lag(status_text,1,'Deinstall') over(partition by mob_id order by media_date) = 'Deinstall' then 'start-of-group'
                     end grp,
                     sum(case status_text when 'Deinstall' then 1 else 0 end) over(partition by mob_id order by media_date) +
                     case lag(status_text,1,'Deinstall') over(partition by mob_id order by media_date) when 'Deinstall' then 1 else 0 end occurrenace_seq
               from  t
      where grp in ('start-of-group','end-of-group')
      group by mob_id,
               occurrenace_seq
      order by mob_id,
               occurrenace_seq
    OCCURRENACE_SEQ     MOB_ID START_MED END_MEDIA NO_OF_DAYS
                  1      39585 04-AUG-09 17-AUG-09         13
                  2      39585 20-AUG-09 26-AUG-09          6
                  3      39585 27-AUG-09 02-SEP-09          6
                  1      54988 05-AUG-09 26-AUG-09         21
                  1      69875 20-AUG-09
    SQL> SY.

  • Help on Analytic Query

    Hi All,
    I would be thankful if you'll could provide solution to my below mentioned query.
    I have the below mentioned data.
    ENO     DT
    1     12/26/2006
    1     12/25/2006
    1     12/24/2006
    2     12/23/2006
    2     12/22/2006
    2     12/21/2006
    2     12/20/2006
    3     12/2/2006
    3     12/1/2006
    The result which I want through a query is below. The below result gives 1 row of each Eno, which are less than the Max(Dt) of each of the Eno.
    ENO     DT
    1     12/25/2006
    2     12/22/2006
    3     12/1/2006
    Also, I want to give the value 1 row dynamically, like now it is 1 row, next time it will be 2 row, 3 row and so on, and it should show me result accordingly.
    Waiting for your feedbacks and solutions.
    Regards,
    MAK

    Here is what I have.
    SQL> select * from ana_fn;
           ENO DT
             1 26-DEC-06
             1 25-DEC-06
             1 24-DEC-06
             2 23-DEC-06
             2 22-DEC-06
             2 21-DEC-06
             2 20-DEC-06
             3 19-DEC-06
             3 18-DEC-06
    9 rows selected.
    SQL>
    SQL> ed
    Wrote file afiedt.buf
      1  select * from
      2  (
      3  select eno, dt,
      4  row_number() over (partition by eno order by dt desc) rn_dt
      5  from ana_fn
      6  )
      7* where rn_dt = 2
    SQL> /
           ENO DT             RN_DT
             1 25-DEC-06          2
             2 22-DEC-06          2
             3 18-DEC-06          2And what exactly did you mean by dynamic?
    Sorry, my mistake. Had read the post wrong.
    Message was edited by:
    Keshav.B

  • ORA-00905: missing keyword -- with analytical query

    Hi Gurus,
    I created a function in my developer 10g server. where it worked fine.
    But my SIT server is a Version 9.2.0.6.0 . The same function is giving me this error.
    create or replace function test22 return number
    is
    CURSOR C2 IS
    SELECT MAX(sysdate) OVER(PARTITION BY TO_CHAR(sysdate, 'MMRRRR') ORDER BY sysdate ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) EFF_FROM_DT_CONV
    from dual ;
    begin
    for i in c2
    loop
    DBMS_OUTPUT.PUT_LINE('HI' || I.EFF_FROM_DT_CONV);
    end loop;
    null;
    return 1;
    end;
    Show error
    5/1 PL/SQL: SQL Statement ignored
    5/130 PL/SQL: ORA-00905: missing keyword
    Please help me how to resolve this issue.
    If I run the sql statement in sqlprmt it works fine. But when I integrate with PL/SQL am getting error

    You properbly hit bug
    Bug 3083373 ORA-905 when using an analytic clause in SQL within PLSQL
    which is fixed in 9.2.0.7
    As Workaround you could use dynamic SQL (EXECUTE IMMEDIATE...)

  • SQL - Analytical Query Question

    Hi All,
    I have a requirement for which I am trying to generate the output and I am not able to come up with good logic to solve this issue. I have been trying to solve this for some time now and am not able to figure out how.
    I have posted a similar kind of post some time back but this is different to the original one and little more complex than my previous question. I have listed below the script to create a table and insert data.
    DROP TABLE ITEMTABLE
    CREATE TABLE ITEMTABLE
      ITEMTABLEID1           NUMBER(9) NOT NULL, 
      ITEMTABLEID2           NUMBER(9) NOT NULL,
      PARENTTABLEID          NUMBER(9),
      PARENTINFO          VARCHAR2(20), 
    CONSTRAINT ITEMTABLE_PK PRIMARY KEY (ITEMTABLEID1,ITEMTABLEID2)          
    Insert into ITEMTABLE values (19217,10245,19216,'PARENTINFO-1');
    Insert into ITEMTABLE values (19217,10315,19216,'PARENTINFO-2' );
    Insert into ITEMTABLE values (19217,10336,19216,'PARENTINFO-2' );
    DROP TABLE FINANCE
    CREATE TABLE FINANCE
      FINANCEKEY          NUMBER(9) NOT NULL,
      PARENTID1           NUMBER(9) NOT NULL, 
      PARENTID2           NUMBER(9) NOT NULL,  
      CONSTRAINT FINANCE_PK PRIMARY KEY (FINANCEKEY)
    Insert into FINANCE values (8332, 19217,10245);
    Insert into FINANCE values (8404, 19217, 10315);
    Insert into FINANCE values (8425, 19217, 10336);
    DROP TABLE ACCT
    CREATE TABLE ACCT
      ACCTKEY             NUMBER(9)  NOT NULL,   
      FINANCEKEY          NUMBER(9),
      FLAG                VARCHAR2(1), 
      SOURCEKEY           NUMBER(9),
      CONSTRAINT ACCT_PK PRIMARY KEY (ACCTKEY)
    Insert into ACCT values (9874, 8332, 'N',0);
    Insert into ACCT values (9875, 8332, 'N',0 );
    Insert into ACCT values (9982, 8404, 'Y', 9874);
    Insert into ACCT values (9983, 8404, 'Y', 9875);
    Insert into ACCT values (10008, 8425, 'N', 9982);
    Insert into ACCT values (10009, 8425, 'Y', 9983);
    SQL> With tempacct1 as
      2    (Select  I.ITEMTABLEID1,I.ITEMTABLEID2, AC.SOURCEKEY, NVL(AC.FLAG,'N') AS FLAG, AC.ACCTKEY
      3     FROM ITEMTABLE I,FINANCE F,ACCT AC
      4    where I.ITEMTABLEID1 = F.PARENTID1
      5      and I.ITEMTABLEID2 =  F.PARENTID2
      6    and F.FINANCEKEY = AC.FINANCEKEY
      7        and I.PARENTTABLEID = 19216
      8         ORDER BY  acctkey ASC
      9        )
    10     SELECT  ITEMTABLEID1,ITEMTABLEID2,acctkey, flag ,SOURCEKEY
    11     FROM    tempacct1;
    ITEMTABLEID1 ITEMTABLEID2    ACCTKEY F  SOURCEKEY
           19217        10245       9874 N          0
           19217        10245       9875 N          0
           19217        10315       9982 Y       9874
           19217        10315       9983 Y       9875
           19217        10336      10008 N       9982
           19217        10336      10009 Y       9983
    6 rows selected.
    Desired Output -
    ITEMTABLEID1 ITEMTABLEID2    ACCTKEY F  SOURCEKEY
           19217        10336      10008 N       9982
           19217        10336      10009 Y       9983The solution by Frank for my previous post few weeks back looks like this :-
    SQL>    SELECT  sourcekey
      2  , flag
      3  , acctkey
      4  FROM (
      5       SELECT  ac.sourcekey
      6       ,     NVL (ac.flag, 'N') AS flag
      7       ,     ac.acctkey
      8       ,     RANK () OVER ( PARTITION BY  CASE
      9                         WHEN  sourcekey = 0
    10             THEN  acctkey
    11             ELSE  sourcekey
    12                     END
    13         ORDER BY      CASE
    14                              WHEN  ac.flag = 'Y'
    15                    THEN  1
    16             ELSE  2
    17                   END
    18         ,   SIGN (sourcekey)
    19                    ) AS rnk
    20          FROM    itemtable i
    21       ,     finance f
    22       ,     acct ac
    23         WHERE   i.itemtableid1  = f.parentid1
    24         AND     i.itemtableid2  = f.parentid2
    25       AND     f.financekey  = ac.financekey
    26         AND     i.parenttableid  = 19216
    27   )
    28  WHERE rnk = 1;
    SOURCEKEY F    ACCTKEY
          9874 Y       9982  -- Needs to be removed
          9875 Y       9983  -- Needs to be removed
          9982 N      10008  
          9983 Y      10009
    Output Desired would be
    ITEMTABLEID1 ITEMTABLEID2    ACCTKEY F  SOURCEKEY
           19217        10336      10008 N       9982
           19217        10336      10009 Y       9983
    SQL> The slight change to the requirement is when we have sourcekey that is same as acctkey then only display the row which has max acctkey. So in this case, the last two row have a sourcekey of 9982, 9983 which is equal to acctkey of first two rows. So, we look for Max(Acctkey) which would be 10008 and 10009 and only display those.
    This logic needs to be added on top of the existing logic. So I am not sure how it could be done.
    I would really appreciate any help.
    SQL> select * from v$version;
    BANNER
    Oracle Database 10g Release 10.2.0.4.0 - 64bit Production
    PL/SQL Release 10.2.0.4.0 - Production
    CORE    10.2.0.4.0      Production
    TNS for Linux: Version 10.2.0.4.0 - Production
    NLSRTL Version 10.2.0.4.0 - ProductionEdited by: ARIZ on Jun 16, 2010 7:56 PM

    Hi,
    This gets the right results from your sample data.
    SELECT  ac.sourcekey
    ,       NVL (ac.flag, 'N') AS flag
    ,       ac.acctkey
    FROM    itemtable     i
    ,          finance          f
    ,       acct          ac
    WHERE   i.itemtableid1   = f.parentid1
    AND     i.itemtableid2   = f.parentid2
    AND     f.financekey     = ac.financekey
    AND     i.parenttableid  = 19216
    AND      ac.acctkey     NOT IN ( SELECT  sourcekey
                          FROM      acct
                         WHERE      sourcekey     IS NOT NULL     -- If needed
    ; I'm a little uncertain of your requirements, so I'm not sure how it will work on your real data.
    At least in this new version of the problem, it looks like rows can be chained together, where the sourcekey of one row is the acctkey of the next row. If you want only the first row in each such chain, just look for the ones where the acctkey does not relate back to any sourcekey.
    NOT IN is never TRUE if the subquery returns any NULLs. Unless sourcekey has a NOT NULL constraint, you'd better check for it in the NOT IN sub-query.

  • Analytic Query Dense Rank Criteria

    Hello folks,
    I haven't had luck to figure out how to solve this problem; need someone to help me with this. I'm guessing this can't be done in a single SQL, has to be a PL / SQL logic;
    Say we have an Airline system where we have flights belonging to two airlines, for example United & Continental. If someone wants to make a reservation for 10 seats, the reservation has to split equally between united & continental, in this case 5 seats should go to each airline. lets assume united has 3 flights and continental has 3 flights, and assuming flights with same routes ( unique flight numbers though),
    so in this case i would need to pick 5 seats in 3 separate flights for each of United & continental. On the first iteration the diversity should be one seat per flight. So, 3 seats would be reserved on 3 separate flights for united, On the 2nd iteration 2 more seats should be reserved across those 3 flights, the only thing to consider is the seat should be on a different row from the one already selected. When reserving for continental, it has to follow the same logic as applied to united. Seat numbers selected should exactly be the same between the flights from Continental & United, we need to loop until we find a matching available seat number between the flights, If we cannot find common seat number between those flights I should error out saying request cannot be fulfilled.
    Let's picture this with some test data, hopefully that makes it more clear :
    AIRLINES Table:
    ID
    AIRLINES
    1
    UNITED
    2
    CONTINENTAL
    FLIGHTS Table:
    ID
    ORIGIN
    DESTINATION
    AIRLINES
    FLIGHT#
    1
    NYC
    BOS
    UNITED
    100
    2
    CHI
    LA
    UNITED
    101
    3
    DEN
    ATL
    UNITED
    102
    4
    NYC
    BOS
    CONTINENTAL
    103
    5
    CHI
    LA
    CONTINENTAL
    104
    6
    DEN
    ATL
    CONTINENTAL
    105
    INVENTORY Table:
    ID
    FLIGHT#
    SEAT_ROW
    SEAT#
    AVAILABILITY
    1
    100
    1
    A
    N
    2
    100
    1
    B
    Y
    3
    100
    2
    A
    Y
    4
    100
    2
    B
    Y
    5
    101
    1
    A
    Y
    6
    101
    1
    B
    N
    7
    101
    2
    A
    N
    8
    101
    2
    B
    Y
    9
    102
    1
    A
    Y
    10
    102
    1
    B
    Y
    11
    102
    2
    A
    Y
    12
    102
    2
    B
    Y
    13
    103
    1
    A
    Y
    14
    103
    1
    B
    N
    15
    103
    2
    A
    N
    16
    103
    2
    B
    Y
    17
    104
    1
    A
    Y
    18
    104
    1
    B
    Y
    19
    104
    2
    A
    Y
    20
    104
    2
    B
    Y
    21
    105
    1
    A
    N
    22
    105
    1
    B
    Y
    23
    105
    2
    A
    Y
    24
    105
    2
    B
    Y
    With the sample data I have above, if there is a request for 10 seats,
    5 seats will need to be booked over United on flights 100, 101 & 102.
    5 seats will need to be booked over Continental on flights 103, 104 & 105.
    On Iteration 1 >> Only 3 seats are reserved
    (a) When looking for a seat availability on flight 100 (united), corresponding search needs to be done on flight 103(continental) to try and find exact seat number available on both the flights, Only Seat row 2 and Seat B satisfies this request , so the return set should be IDs ( 4, 16) from the Inventory Table.
    (b) Similarly, When looking for a seat availability on flight 101 (united), corresponding search needs to be done on flight 104(continental) to try and find exact seat number available on both the flights,  the return set could be IDs ( 5, 17)  or ( 8, 20 ) from the Inventory Table.
    (c) Similarly, When looking for a seat availability on flight 102 (united), corresponding search needs to be done on flight 105(continental) to try and find exact seat number available on both the flights,  the return set could be IDs ( 10, 22)  or ( 11, 23 ) or (12, 24) from the Inventory Table.
    On Iteration 2 >> 2 more seats are reserved
    (a) flights 100 & 103 have no more seats common seats left that satisfy our conditions.
    (b) if (5, 17) were selected in the prior iteration, then (8, 20) should be the return set from Inventory table as they satisfy the condition the seats belong to two different rows.
    (c) if (10, 22) or (11, 23) were selected in the prior iteration, then  (12, 24) should be the return set from the Inventory table as they satisfy the condition the seats belong to two different rows.
    I would like to perform this uniform distribution in Sql or Pl/ Sql and extract the return set as part of automation. I hope the requirement here is clear enough. btw, we are using Oracle 11G R2. Let me know if you have questions,
    Thanks in advance,
    Chandu

    Sorry for the late reply, I haven't really got a chance to test your SQL query. When I tried this morning it almost worked except for the 3rd diversity rule. I was trying to tweak your code to make it work but I hadn't had any luck. Appreciate if you could help me again
    In earlier case I framed my example using Airline system, Diversity rules are still the Same. For convenient purposes I replaced with real test data.
    Diversity Rules:
    No.of Ports Requested := N ( which means N/ 2 should be fulfilled in each Switch & its corresponding Switch Partner within a Fabric/Partner);
    Note: Odd no. requests will be rejected, system will only allow even numbered requests
    Rule 1 - (a) Split request evenly between available Switches (per Fabric)
    IF  (a) doesn't fully complete my request  THEN
    Rule 2 - (b) Port assignment on the same Switch should happen on a different Line_NO from what has been assigned in (a)
    IF  (b) did not fully complete my request THEN
    Rule 3 -(c) If on the initial iteration one port from each line_No is consumed from a switch , Port assignment can repeat on the already assigned Line_No but the port should belong to different Port_group from what was initially assigned.
    All the above diversity rules should take into consideration that port assignments should exactly match between Switch-Pairs (Origin - Destination) belonging to two different Fabrics ( Fabric & its Partner)
    Here's some test data:
    WITH PORTS_AVAIL
    AS
    (SELECT 'dev340h104f01' ORIGIN,'dev340h104f02' DESTINATION,'340_Fabric1' FABRIC,'340_Fabric2' FABRIC_PARTNER,'1' LINE_NO,'fc1/4' PORT_NAME,'ASIC 0' PORT_GROUP ,'20:04:00:05:1E:36:46:20' PORT_WWN FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','1','fc1/8','ASIC 0','20:08:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','1','fc1/9','ASIC 0','20:09:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','1','fc1/13','ASIC 0','20:0D:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','1','fc1/17','ASIC 1','20:81:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','1','fc1/18','ASIC 1','20:82:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','1','fc1/23','ASIC 1','20:87:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','1','fc1/24','ASIC 1','20:88:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','1','fc1/31','ASIC 1','20:8F:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','2','fc2/4','ASIC 0','20:14:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','2','fc2/6','ASIC 0','20:16:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','2','fc2/7','ASIC 0','20:17:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','2','fc2/11','ASIC 0','20:1B:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','2','fc2/12','ASIC 0','20:1C:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','2','fc2/17','ASIC 1','20:91:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','2','fc2/19','ASIC 1','20:93:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','2','fc2/25','ASIC 1','20:99:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','2','fc2/27','ASIC 1','20:9B:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','2','fc2/31','ASIC 1','20:9F:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','2','fc2/36','ASIC 3','2E:14:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','2','fc2/38','ASIC 3','2E:16:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','2','fc2/39','ASIC 3','2E:17:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','2','fc2/40','ASIC 3','2E:18:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','2','fc2/41','ASIC 3','2E:19:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','3','fc3/5','ASIC 0','20:25:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','3','fc3/8','ASIC 0','20:28:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','3','fc3/9','ASIC 0','20:29:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','3','fc3/10','ASIC 0','20:2A:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','3','fc3/11','ASIC 0','20:2B:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','3','fc3/12','ASIC 0','20:2C:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','3','fc3/13','ASIC 0','20:2D:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','3','fc3/14','ASIC 0','20:2E:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','3','fc3/18','ASIC 1','20:A2:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','3','fc3/23','ASIC 1','20:A7:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','3','fc3/30','ASIC 1','20:AE:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','3','fc3/36','ASIC 3','2E:24:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','4','fc4/4','ASIC 0','20:34:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','4','fc4/6','ASIC 0','20:36:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','4','fc4/8','ASIC 0','20:38:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','4','fc4/13','ASIC 0','20:3D:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','4','fc4/19','ASIC 1','20:B3:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','4','fc4/22','ASIC 1','20:B6:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','4','fc4/27','ASIC 1','20:BB:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','4','fc4/28','ASIC 1','20:BC:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','4','fc4/30','ASIC 1','20:BE:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','4','fc4/33','ASIC 3','2E:31:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','4','fc4/35','ASIC 3','2E:33:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/10','ASIC 0','20:4A:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/12','ASIC 0','20:4C:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/13','ASIC 0','20:4D:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/14','ASIC 0','20:4E:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/15','ASIC 0','20:4F:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/17','ASIC 1','20:C1:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/23','ASIC 1','20:C7:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/24','ASIC 1','20:C8:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/25','ASIC 1','20:C9:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/26','ASIC 1','20:CA:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/27','ASIC 1','20:CB:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/28','ASIC 1','20:CC:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/29','ASIC 1','20:CD:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/30','ASIC 1','20:CE:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/31','ASIC 1','20:CF:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/32','ASIC 3','2E:40:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/36','ASIC 3','2E:44:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/38','ASIC 3','2E:46:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/39','ASIC 3','2E:47:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','7','fc7/42','ASIC 3','2E:4A:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','8','fc8/6','ASIC 0','20:56:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','8','fc8/7','ASIC 0','20:57:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','8','fc8/9','ASIC 0','20:59:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','8','fc8/15','ASIC 0','20:5F:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','8','fc8/18','ASIC 1','20:D2:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','8','fc8/22','ASIC 1','20:D6:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','8','fc8/23','ASIC 1','20:D7:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','8','fc8/25','ASIC 1','20:D9:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','8','fc8/26','ASIC 1','20:DA:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','8','fc8/30','ASIC 1','20:DE:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','8','fc8/34','ASIC 3','2E:52:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','8','fc8/38','ASIC 3','2E:56:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','8','fc8/40','ASIC 3','2E:58:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','8','fc8/41','ASIC 3','2E:59:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','8','fc8/42','ASIC 3','2E:5A:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','8','fc8/43','ASIC 3','2E:5B:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','8','fc8/44','ASIC 3','2E:5C:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','9','fc9/5','ASIC 0','20:65:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','9','fc9/11','ASIC 0','20:6B:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','9','fc9/12','ASIC 0','20:6C:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','9','fc9/24','ASIC 1','20:E8:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','9','fc9/28','ASIC 1','20:EC:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','9','fc9/37','ASIC 3','2E:65:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','10','fc10/6','ASIC 0','20:76:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','10','fc10/11','ASIC 0','20:7B:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','10','fc10/18','ASIC 1','20:F2:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','10','fc10/27','ASIC 1','20:FB:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','10','fc10/37','ASIC 3','2E:75:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','10','fc10/38','ASIC 3','2E:76:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','10','fc10/39','ASIC 3','2E:77:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f01','dev340h104f02','340_Fabric1','340_Fabric2','10','fc10/42','ASIC 3','2E:7A:00:05:1E:36:46:20' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','1','fc1/8','ASIC 0','20:08:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','1','fc1/9','ASIC 0','20:09:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','1','fc1/17','ASIC 1','20:81:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','1','fc1/18','ASIC 1','20:82:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','1','fc1/24','ASIC 1','20:88:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','1','fc1/28','ASIC 1','20:8C:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','1','fc1/31','ASIC 1','20:8F:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','2','fc2/4','ASIC 0','20:14:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','2','fc2/11','ASIC 0','20:1B:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','2','fc2/12','ASIC 0','20:1C:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','2','fc2/17','ASIC 1','20:91:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','2','fc2/18','ASIC 1','20:92:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','2','fc2/19','ASIC 1','20:93:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','2','fc2/23','ASIC 1','20:97:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','2','fc2/25','ASIC 1','20:99:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','2','fc2/26','ASIC 1','20:9A:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','2','fc2/27','ASIC 1','20:9B:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','2','fc2/31','ASIC 1','20:9F:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','2','fc2/36','ASIC 3','2E:14:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','2','fc2/37','ASIC 3','2E:15:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','2','fc2/38','ASIC 3','2E:16:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','2','fc2/39','ASIC 3','2E:17:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','2','fc2/40','ASIC 3','2E:18:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','2','fc2/41','ASIC 3','2E:19:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','3','fc3/5','ASIC 0','20:25:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','3','fc3/8','ASIC 0','20:28:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','3','fc3/9','ASIC 0','20:29:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','3','fc3/10','ASIC 0','20:2A:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','3','fc3/11','ASIC 0','20:2B:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','3','fc3/12','ASIC 0','20:2C:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','3','fc3/13','ASIC 0','20:2D:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','3','fc3/14','ASIC 0','20:2E:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','3','fc3/18','ASIC 1','20:A2:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','3','fc3/30','ASIC 1','20:AE:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','3','fc3/36','ASIC 3','2E:24:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','4','fc4/4','ASIC 0','20:34:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','4','fc4/6','ASIC 0','20:36:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','4','fc4/8','ASIC 0','20:38:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','4','fc4/13','ASIC 0','20:3D:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','4','fc4/19','ASIC 1','20:B3:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','4','fc4/27','ASIC 1','20:BB:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','4','fc4/28','ASIC 1','20:BC:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','4','fc4/30','ASIC 1','20:BE:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','4','fc4/33','ASIC 3','2E:31:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','4','fc4/35','ASIC 3','2E:33:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/10','ASIC 0','20:4A:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/12','ASIC 0','20:4C:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/13','ASIC 0','20:4D:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/14','ASIC 0','20:4E:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/15','ASIC 0','20:4F:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/17','ASIC 1','20:C1:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/22','ASIC 1','20:C6:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/23','ASIC 1','20:C7:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/24','ASIC 1','20:C8:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/25','ASIC 1','20:C9:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/26','ASIC 1','20:CA:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/27','ASIC 1','20:CB:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/28','ASIC 1','20:CC:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/29','ASIC 1','20:CD:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/30','ASIC 1','20:CE:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/31','ASIC 1','20:CF:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/32','ASIC 3','2E:40:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/36','ASIC 3','2E:44:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/38','ASIC 3','2E:46:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/39','ASIC 3','2E:47:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','7','fc7/42','ASIC 3','2E:4A:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','8','fc8/5','ASIC 0','20:55:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','8','fc8/6','ASIC 0','20:56:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','8','fc8/7','ASIC 0','20:57:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','8','fc8/9','ASIC 0','20:59:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','8','fc8/15','ASIC 0','20:5F:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','8','fc8/18','ASIC 1','20:D2:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','8','fc8/25','ASIC 1','20:D9:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','8','fc8/26','ASIC 1','20:DA:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','8','fc8/30','ASIC 1','20:DE:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','8','fc8/34','ASIC 3','2E:52:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','8','fc8/38','ASIC 3','2E:56:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','8','fc8/40','ASIC 3','2E:58:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','8','fc8/41','ASIC 3','2E:59:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','8','fc8/42','ASIC 3','2E:5A:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','8','fc8/43','ASIC 3','2E:5B:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','8','fc8/44','ASIC 3','2E:5C:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','9','fc9/5','ASIC 0','20:65:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','9','fc9/11','ASIC 0','20:6B:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','9','fc9/24','ASIC 1','20:E8:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','9','fc9/37','ASIC 3','2E:65:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','10','fc10/11','ASIC 0','20:7B:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','10','fc10/18','ASIC 1','20:F2:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','10','fc10/27','ASIC 1','20:FB:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','10','fc10/37','ASIC 3','2E:75:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','10','fc10/38','ASIC 3','2E:76:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','10','fc10/39','ASIC 3','2E:77:00:05:1E:36:48:46' FROM DUAL UNION ALL
    SELECT 'dev340h104f02','dev340h104f01','340_Fabric2','340_Fabric1','10','fc10/42','ASIC 3','2E:7A:00:05:1E:36:48:46' FROM DUAL
    --SELECT * FROM PORTS_AVAIL
    BOTH_AVAIL
         AS
    (SELECT   A.ORIGIN,
                    A.DESTINATION,
                    TO_NUMBER(LINE_NO) LINE_NO,
                    PORT_NAME,
                    A.FABRIC ORG_FABRIC_NAME,
                    B.FABRIC DEST_FABRIC_NAME,
                    A.ORIGIN ORG_SWITCH_NAME,
                    B.ORIGIN DEST_SWITCH_NAME,
                    A.PORT_WWN ORG_PORT_WWN,
                    B.PORT_WWN DEST_PORT_WWN,
                    A.PORT_GROUP ORG_PORT_GROUP,
                    B.PORT_GROUP DEST_PORT_GROUP,
                    DENSE_RANK ()
                       OVER (PARTITION BY A.ORIGIN ORDER BY TO_NUMBER(LINE_NO))
                       DR_LINE_NO,
                    ROW_NUMBER ()
                    OVER (
                       PARTITION BY A.ORIGIN, TO_NUMBER(LINE_NO)
                       ORDER BY
                          TRIM (
                             TO_CHAR (REGEXP_SUBSTR (PORT_NAME, '[0-9]{1,3}'),
                                      '000'))
                          || TRIM (
                                TO_CHAR (
                                   LTRIM (
                                      REGEXP_SUBSTR (PORT_NAME,
                                                     '(\/)[[:digit:]]{0,3}'),
                                   '000')))
                       RN_PORTNAME,
                    DENSE_RANK ()
                       OVER (PARTITION BY A.ORIGIN ORDER BY A.PORT_GROUP)
                       DR_PORT_GROUP
               FROM PORTS_AVAIL A JOIN PORTS_AVAIL B USING (LINE_NO, PORT_NAME)   
              WHERE 1 = 1   
                    AND A.DESTINATION = B.ORIGIN
                    AND A.FABRIC < B.FABRIC
    --SELECT * FROM BOTH_AVAIL A
         BUY_ORDER
         AS (
    SELECT A.*,
                    COUNT (*)
                       OVER (ORDER BY
                                RN_PORTNAME,
                                DR_LINE_NO,
                                DR_PORT_GROUP,
                                ORG_SWITCH_NAME)
                       buy_rn,
                    COUNT (*) OVER () max_possible
               FROM both_avail A              
               WHERE   (DR_LINE_NO = 1 OR DR_PORT_GROUP = 1)
    SELECT
           LINE_NO "BLADE",
           PORT_NAME,
           ORG_FABRIC_NAME,
           ORG_SWITCH_NAME,
           ORG_PORT_WWN,
           DEST_FABRIC_NAME,
           DEST_SWITCH_NAME,
           DEST_PORT_WWN,
           ORG_PORT_GROUP,
           DEST_PORT_GROUP
      FROM buy_order
    WHERE :seat_req / 2 BETWEEN buy_rn AND max_possible
           AND TRUNC (:seat_req / 2) = :seat_req / 2;
    A total of 33 ports (per switch) can be assigned; What does the below condition do ? If I don't apply this condition I get more record set. If you could explain me the Rank_over part that would be great.
    WHERE   (DR_LINE_NO = 1 OR DR_PORT_GROUP = 1)
    When I run the above SQL for a request for 20 Ports, the first 8 records satisfy my diversity rules
    (1) Only 1 switch-Pair combination exists (  dev340h104f01<=> dev340h104f02 ), not much there to diversify.
    (2) Port assignment is distributed among the unique Line_No's for the only available Switch-Pair. Each of the first 8 ports belong to unique Line_No.
    (3) Port assignment on the same line_no can happen but should belong to a different Port Group. Records (9) & (10) (highlighted in RED below) should have come from different Port_Groups ( Asic 1/2/3 not Asic 0). In this case next port (9th record) that can be made available was on Line_No 1 with port as fc1/17 which is Asic 1 & 10th record should be fc2/17 which belongs to Asic 1.
    Below is the output when I run the original sql.
    Blade
    Port_Name
    ORG_FABRIC_NAME
    ORG_SWITCH_NAME
    ORG_PORT_WWN
    DEST_FABRIC_NAME
    DEST_SWITCH_NAME
    DEST_PORT_WWN
    ORG_PORT_GRP
    DEST_PORT_GRP
    1
    fc1/8
    340_Fabric1
    dev340h104f01
    20:08:00:05:1E:36:46:20
    340_Fabric2
    dev340h104f02
    20:08:00:05:1E:36:48:46
    ASIC 0
    ASIC 0
    2
    fc2/4
    340_Fabric1
    dev340h104f01
    20:14:00:05:1E:36:46:20
    340_Fabric2
    dev340h104f02
    20:14:00:05:1E:36:48:46
    ASIC 0
    ASIC 0
    3
    fc3/5
    340_Fabric1
    dev340h104f01
    20:25:00:05:1E:36:46:20
    340_Fabric2
    dev340h104f02
    20:25:00:05:1E:36:48:46
    ASIC 0
    ASIC 0
    4
    fc4/4
    340_Fabric1
    dev340h104f01
    20:34:00:05:1E:36:46:20
    340_Fabric2
    dev340h104f02
    20:34:00:05:1E:36:48:46
    ASIC 0
    ASIC 0
    7
    fc7/10
    340_Fabric1
    dev340h104f01
    20:4A:00:05:1E:36:46:20
    340_Fabric2
    dev340h104f02
    20:4A:00:05:1E:36:48:46
    ASIC 0
    ASIC 0
    8
    fc8/6
    340_Fabric1
    dev340h104f01
    20:56:00:05:1E:36:46:20
    340_Fabric2
    dev340h104f02
    20:56:00:05:1E:36:48:46
    ASIC 0
    ASIC 0
    9
    fc9/5
    340_Fabric1
    dev340h104f01
    20:65:00:05:1E:36:46:20
    340_Fabric2
    dev340h104f02
    20:65:00:05:1E:36:48:46
    ASIC 0
    ASIC 0
    10
    fc10/11
    340_Fabric1
    dev340h104f01
    20:7B:00:05:1E:36:46:20
    340_Fabric2
    dev340h104f02
    20:7B:00:05:1E:36:48:46
    ASIC 0
    ASIC 0
    1
    fc1/9
    340_Fabric1
    dev340h104f01
    20:09:00:05:1E:36:46:20
    340_Fabric2
    dev340h104f02
    20:09:00:05:1E:36:48:46
    ASIC 0
    ASIC 0
    2
    fc2/11
    340_Fabric1
    dev340h104f01
    20:1B:00:05:1E:36:46:20
    340_Fabric2
    dev340h104f02
    20:1B:00:05:1E:36:48:46
    ASIC 0
    ASIC 0

  • Analytical query producing different result on joins

    Hi,
    The queries below should have the same output but the first one just does a left join instead of a full join. Can you please help me figure out why ?
    SELECT source_aa, source_bb, COUNT (*)
    FROM (SELECT *
    FROM (SELECT a_a.application_id,
    'In_APPLICATION' AS source_aa,
    RANK () OVER (PARTITION BY application_id ORDER BY date DESC) AS rank_aa
    FROM application a_a)
    WHERE rank_aa = 1) aa
    FULL JOIN
    (SELECT *
    FROM (SELECT b_b.application_id,
    'In_APPLICATION_ARCHV' AS source_bb,
    RANK () OVER (PARTITION BY application_id ORDER BY date DESC) AS rank_bb
    FROM application_archv b_b)
    WHERE rank_bb = 1) bb
    ON aa.application_id = bb.application_id
    GROUP BY source_aa, source_bb;
    SELECT source_aa, source_bb, COUNT (*)
    FROM (SELECT DISTINCT application_id,'In_APPLICATION' AS source_aa
    FROM application) aa
    FULL JOIN
    (SELECT DISTINCT application_id,'In_APPLICATION_ARCHV' AS source_bb
    FROM application_archv) bb
    ON aa.application_id = bb.application_id
    GROUP BY source_aa, source_bb;
    -----

    Both your query does a FULL JOIN. But in the first query you have extra filter condition. You are geting only the latest application_id. Check this
    <pre>
    SELECT *
    FROM (
    SELECT b_b.application_id
    , 'In_APPLICATION_ARCHV' AS source_bb
    <font color=red>
    , RANK () OVER (PARTITION BY application_id ORDER BY date DESC) AS rank_bb
    </font>
    FROM application_archv b_b
    <font color=red>
    WHERE rank_bb = 1
    </font>
    </pre>
    The the code in red is the once thats causing the difference in output.

  • Query Help (Kind of Analytical query)

    Hi,
    I have a requirement in which i want to get the following output. I have taken DEPT & EMP as the example tables.
    DEPT EMPLOYEES
    10 1,2,3,4,5,6
    20 7,8,9,10
    30 11,12,13,14
    Your help will be highly appreciated.
    Regards,
    Sunil.

    Hi Gabe,
    Thanks for the quick reply. I checked the asktom site but here he has used PLSQL block to get the output.
    Is it possible to get this output using a single SQL statement.
    Thanks for the help.
    Regards,
    Sunil.

  • Analytical query help

    Hi All,
    I am not able to even paste the simple of texts here , so I am trying to attach a picture ,please have a look.
    Regards
    Rahul
    Pic: http://img340.imageshack.us/i/piculj.jpg/

    WITH DATA AS
    (SELECT 'a' AS STR, '100' AS VAL FROM DUAL UNION ALL
    SELECT 'a' AS STR, '100,200' AS VAL FROM DUAL UNION ALL
    SELECT 'a' AS STR, '100,200,300' AS VAL FROM DUAL UNION ALL
    SELECT 'b' AS STR, '100' AS VAL FROM DUAL UNION ALL
    SELECT 'b' AS STR, '100,200' AS VAL FROM DUAL UNION ALL
    SELECT 'a' AS STR, '100,200,300' AS VAL FROM DUAL UNION ALL
    SELECT 'b' AS STR, '100' AS VAL FROM DUAL UNION ALL
    SELECT 'b' AS STR, '100,200' AS VAL FROM DUAL
    SELECT STR, VAL, MAXVAL FROM
    (SELECT STR, VAL, MAX(LENGTH(VAL)) OVER (PARTITION BY str) AS MAXVAL
    FROM  DATA)
    WHERE LENGTH(VAL)= MAXVALAre you want it?
    Edited by: Mahir M. Quluzade on Feb 28, 2011 5:49 PM

  • Analytic Query Help

    My table has student grades by date. For each student, I need to return the date of the most recent F, and the number of consecutive F's the student had made at that time (NOT the total number of F's). So, for the table data below, I want the sql to return...
    JANE 16-NOV-07 2
    BILL 23-APR-07 4
    NAME          DATE          GRADE
    JANE          08-Feb-08          B
    JANE          28-Dec-07          B
    JANE          16-Nov-07          F
    JANE          05-Oct-07          F
    JANE          24-Aug-07          C
    JANE          13-Jul-07          C
    JANE          01-Jun-07          C
    JANE          20-Apr-07          C
    JANE          09-Mar-07          A
    JANE          26-Jan-07          F
    JANE          15-Dec-06          B
    JANE          03-Nov-06          B
    JANE          22-Sep-06          F
    JANE          11-Aug-06          F
    JANE          30-Jun-06          F
    JANE          19-May-06          F
    JANE          07-Apr-06          C
    JANE          24-Feb-06          C
    JANE          13-Jan-06          C
    BILL          28-Jan-08          C
    BILL          03-Dec-07          C
    BILL          08-Oct-07          B
    BILL          13-Aug-07          B
    BILL          18-Jun-07          B
    BILL          23-Apr-07          F
    BILL          26-Feb-07          F
    BILL          01-Jan-07          F
    BILL          06-Nov-06          F
    BILL          11-Sep-06          C
    BILL          17-Jul-06          C
    BILL          22-May-06          F
    BILL          27-Mar-06          F
    BILL          30-Jan-06          F

    Find the Latest date of an F (over the students set of data) and then find the latest date of a NON-F within that set. Then take all records between the lower and upper (inclusive) bound.
    ME_XE?    WITH Data AS
      2  (
      3     SELECT 'JANE' AS Student, TO_DATE('08-Feb-08','DD-MON-RR') AS Grade_date, 'B' AS Grade FROM DUAL UNION ALL
      4     SELECT 'JANE' AS Student, TO_DATE('28-Dec-07','DD-MON-RR') AS Grade_date, 'B' AS Grade FROM DUAL UNION ALL
      5     SELECT 'JANE' AS Student, TO_DATE('16-Nov-07','DD-MON-RR') AS Grade_date, 'F' AS Grade FROM DUAL UNION ALL
      6     SELECT 'JANE' AS Student, TO_DATE('05-Oct-07','DD-MON-RR') AS Grade_date, 'F' AS Grade FROM DUAL UNION ALL
      7     SELECT 'JANE' AS Student, TO_DATE('24-Aug-07','DD-MON-RR') AS Grade_date, 'C' AS Grade FROM DUAL UNION ALL
      8     SELECT 'JANE' AS Student, TO_DATE('13-Jul-07','DD-MON-RR') AS Grade_date, 'C' AS Grade FROM DUAL UNION ALL
      9     SELECT 'JANE' AS Student, TO_DATE('01-Jun-07','DD-MON-RR') AS Grade_date, 'C' AS Grade FROM DUAL UNION ALL
    10     SELECT 'JANE' AS Student, TO_DATE('20-Apr-07','DD-MON-RR') AS Grade_date, 'C' AS Grade FROM DUAL UNION ALL
    11     SELECT 'JANE' AS Student, TO_DATE('09-Mar-07','DD-MON-RR') AS Grade_date, 'A' AS Grade FROM DUAL UNION ALL
    12     SELECT 'JANE' AS Student, TO_DATE('26-Jan-07','DD-MON-RR') AS Grade_date, 'F' AS Grade FROM DUAL UNION ALL
    13     SELECT 'JANE' AS Student, TO_DATE('15-Dec-06','DD-MON-RR') AS Grade_date, 'B' AS Grade FROM DUAL UNION ALL
    14     SELECT 'JANE' AS Student, TO_DATE('03-Nov-06','DD-MON-RR') AS Grade_date, 'B' AS Grade FROM DUAL UNION ALL
    15     SELECT 'JANE' AS Student, TO_DATE('22-Sep-06','DD-MON-RR') AS Grade_date, 'F' AS Grade FROM DUAL UNION ALL
    16     SELECT 'JANE' AS Student, TO_DATE('11-Aug-06','DD-MON-RR') AS Grade_date, 'F' AS Grade FROM DUAL UNION ALL
    17     SELECT 'JANE' AS Student, TO_DATE('30-Jun-06','DD-MON-RR') AS Grade_date, 'F' AS Grade FROM DUAL UNION ALL
    18     SELECT 'JANE' AS Student, TO_DATE('19-May-06','DD-MON-RR') AS Grade_date, 'F' AS Grade FROM DUAL UNION ALL
    19     SELECT 'JANE' AS Student, TO_DATE('07-Apr-06','DD-MON-RR') AS Grade_date, 'C' AS Grade FROM DUAL UNION ALL
    20     SELECT 'JANE' AS Student, TO_DATE('24-Feb-06','DD-MON-RR') AS Grade_date, 'C' AS Grade FROM DUAL UNION ALL
    21     SELECT 'JANE' AS Student, TO_DATE('13-Jan-06','DD-MON-RR') AS Grade_date, 'C' AS Grade FROM DUAL UNION ALL
    22     SELECT 'BILL' AS Student, TO_DATE('28-Jan-08','DD-MON-RR') AS Grade_date, 'C' AS Grade FROM DUAL UNION ALL
    23     SELECT 'BILL' AS Student, TO_DATE('03-Dec-07','DD-MON-RR') AS Grade_date, 'C' AS Grade FROM DUAL UNION ALL
    24     SELECT 'BILL' AS Student, TO_DATE('08-Oct-07','DD-MON-RR') AS Grade_date, 'B' AS Grade FROM DUAL UNION ALL
    25     SELECT 'BILL' AS Student, TO_DATE('13-Aug-07','DD-MON-RR') AS Grade_date, 'B' AS Grade FROM DUAL UNION ALL
    26     SELECT 'BILL' AS Student, TO_DATE('18-Jun-07','DD-MON-RR') AS Grade_date, 'B' AS Grade FROM DUAL UNION ALL
    27     SELECT 'BILL' AS Student, TO_DATE('23-Apr-07','DD-MON-RR') AS Grade_date, 'F' AS Grade FROM DUAL UNION ALL
    28     SELECT 'BILL' AS Student, TO_DATE('26-Feb-07','DD-MON-RR') AS Grade_date, 'F' AS Grade FROM DUAL UNION ALL
    29     SELECT 'BILL' AS Student, TO_DATE('01-Jan-07','DD-MON-RR') AS Grade_date, 'F' AS Grade FROM DUAL UNION ALL
    30     SELECT 'BILL' AS Student, TO_DATE('06-Nov-06','DD-MON-RR') AS Grade_date, 'F' AS Grade FROM DUAL UNION ALL
    31     SELECT 'BILL' AS Student, TO_DATE('11-Sep-06','DD-MON-RR') AS Grade_date, 'C' AS Grade FROM DUAL UNION ALL
    32     SELECT 'BILL' AS Student, TO_DATE('17-Jul-06','DD-MON-RR') AS Grade_date, 'C' AS Grade FROM DUAL UNION ALL
    33     SELECT 'BILL' AS Student, TO_DATE('22-May-06','DD-MON-RR') AS Grade_date, 'F' AS Grade FROM DUAL UNION ALL
    34     SELECT 'BILL' AS Student, TO_DATE('27-Mar-06','DD-MON-RR') AS Grade_date, 'F' AS Grade FROM DUAL UNION ALL
    35     SELECT 'BILL' AS Student, TO_DATE('30-Jan-06','DD-MON-RR') AS Grade_date, 'F' AS Grade FROM DUAL
    36  ),
    37     Max_F_Grade_date AS
    38  (
    39     SELECT
    40        Student,
    41        Grade_date,
    42        Grade,
    43        MAX(DECODE(Grade, 'F', Grade_date, NULL)) OVER (PARTITION BY Student) Max_F_Date,
    44        MIN(DECODE(Grade, 'F', Grade_date, NULL)) OVER (PARTITION BY Student) Min_F_Date
    45     FROM Data
    46     ORDER BY Student, Grade_date DESC
    47  ),
    48     Final_set AS
    49  (
    50     SELECT
    51        Student,
    52        Grade_date,
    53        Grade,
    54        Max_F_Date,
    55        MAX(DECODE(Grade, 'F', Min_F_Date, Grade_date)) OVER (PARTITION BY Student) Max_NON_F_Date
    56     FROM Max_F_Grade_date
    57     WHERE Grade_date <= Max_F_Date
    58  )
    59  SELECT
    60     Student,
    61     Max_F_Date,
    62     COUNT(*)
    63  FROM Final_set
    64  WHERE grade_date >   Max_NON_F_Date
    65  GROUP BY Student, Max_F_Date
    66  /
    STUDENT      MAX_F_DATE                           COUNT(*)
    BILL         23-APR-2007 12 00:00                        4
    JANE         16-NOV-2007 12 00:00                        2
    2 rows selected.
    Elapsed: 00:00:00.01

Maybe you are looking for