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 PMHi,
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
Guttiwasguttis 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. -
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,
MAKHere 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 errorYou 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 PMHi,
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,
ChanduSorry 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. -
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 -
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 FFind 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
-
Data in application based on User logged in
Hi, We have a requirment in our project in which we need to prefill few fields of all pages of application based on the user logged in. The required information to be populated in application is available in database table. When the page is gettign l
-
Photoshop Elements 11 Overview | Photoshop Elements 11 Feature Tour | Adobe TV
Easily organize, edit, create, and share great-looking photos. http://adobe.ly/NRb8f7
-
IPhoto 11 is not playing .mov files
I am haing some problem with iPhoto 11 and was wondering if anyone can shed some light on my issue 1) mpg files play fine. 2) Small file size .mov files ONLY play the audio. 3) Large .mov files from my iPhone 4S cause iPhoto to freeze. 4) I can find
-
Nokia 5800 (Backup Restore Problem)
Hi! Yesterday I made a Full phone backup with PC Suite. After that I was going thru all my message (approx 940 of them) in PC Suite, its much eaiser to go thru all with that. And suddenly all messages dissapeared, I tried to reload but no message sh
-
How do I restart my download for a movie again, it just says waiting
How do I restart my download for a movie again, it just says waiting