EVALUATE in OBIEE with Analytic function LAST_VALUE
Hi,
I'm trying to use EVALUATE with analytic function LAST_VALUE but it is giving me error below:
[nQSError: 17001] Oracle Error code: 30483, message: ORA-30483: window functions are not allowed here at OCI call OCIStmtExecute. [nQSError: 17010] SQL statement preparation failed. (HY000)
Thanks
Kumar.
Hi Kumar,
The ORA error tells me that this is something conveyed by the oracle database but not the BI Server. In this case, the BI server might have fired the incorrect query onto the DB and you might want to check what's wrong with it too.
The LAST_VALUE is an analytic function which works over a set/partition of records. Request you to refer to the semantics at http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions073.htm and see if it is violating any rules here. You may want to post the physical sql here too to check.
Hope this helps.
Thank you,
Dhar
Similar Messages
-
Hi,
Please find below table structure and insert scritps. Requesting for vluable help.
create table temp2 (col1 number,col2 varchar2(10),col3 number,col4 varchar2(20));
insert into temp2 values (1,'a',100,'vvv');
insert into temp2 values (2,'b',200,'www');
insert into temp2 values (3,'c',300,'xxx');
insert into temp2 values (4,'d',400,'yyy');
insert into temp2 values (5,'e',500,'zzz');
insert into temp2 values (6,'f',600,'aaa');
insert into temp2 values (7,'g',700,'bbb');
insert into temp2 values (8,'h',800,'ccc');
I am trying to get same output, what we get from below UNION query with ANALYTICAL Function.
select * from temp2 where col1 in (1,2,3,4,5)
union
select * from temp2 where col1 in (1,2,5,6)
union
select * from temp2 where col1 in (1,2,7,8);
I am seeking help by this dummy example to understand the concept, how can we use analytical functional over UNION or OUTER JOINS.
In my exact query, I am using same table three times adding UNION clause. here also we scan temp2 three times, so for bulky tables using 'union' would be hampering query's performance
It means i go with three time scans of same table that is not performance oriented. With the help of above required concept, i will try to remove UNIONs from my exact query.
Thanks!!Thanks for your time BluShadow and sorry as i think i couldn't make my query clear.
I try it again. Below there are three queries, you may see all three queries are using same tables. Difference in all three queries are just few conditions, which makes all three queries diff with each other.
I know, u cant run below query in your database, but i think it will convey my doubt to you. I have mentioned no. of rows with each clause and total i am getting 67 rows as my output. (Reason may be first n third query's result set are the subset of Second Query dataset)
So i want to take all common rows as well as additional rows, if present in any of the query. This is getting easliy done with UNION clause but want to have it in other way as here my same is getting scanned again n again.
SELECT
START_TX.FX_TRAN_ID START_FX_TRAN_ID
,END_TX.FX_TRAN_ID END_FX_TRAN_ID
,START_TX.ENTERED_DT_TS
,USER
,START_TX.TRADE_DT
,START_TX.DEAL_NUMBER
,START_TX.FX_DEAL_TYPE
,START_TX.ORIENTATION_BUYSELL
,START_TX.BASE_CCY
,START_TX.BASE_CCY_AMT
,START_TX.SECONDARY_CCY
,START_TX.SECONDARY_CCY_AMT
,START_TX.MATURITY_DT
,START_TX.TRADE_RT
,START_TX.FORWARD_PTS
,START_TX.CORPORATE_PIPS
,START_TX.DEAL_OWNER_INITIALS
,START_TX.CORPORATE_DEALER
,START_TX.PROFIT_CENTER_CD
,START_TX.COUNTERPARTY_NM
,START_TX.COUNTERPARTY_NUMBER
FROM
(SELECT * FROM FX_TRANSACTIONS WHERE GMT_CONV_ENTERED_DT_TS >= TO_DATE('20-Nov-2013 4:00:01 AM','DD-Mon-YYYY HH:MI:SS AM')) START_TX
INNER JOIN
(SELECT * FROM FX_TRANSACTIONS WHERE GMT_CONV_ENTERED_DT_TS <= TO_DATE('20-Nov-2013 4:59:59 PM','DD-Mon-YYYY HH:MI:SS AM')) END_TX
ON START_TX.COUNTERPARTY_NM = END_TX.COUNTERPARTY_NM AND
START_TX.COUNTERPARTY_NUMBER = END_TX.COUNTERPARTY_NUMBER AND
START_TX.FX_DEAL_TYPE = END_TX.FX_DEAL_TYPE AND
START_TX.BASE_CCY = END_TX.BASE_CCY AND
START_TX.SECONDARY_CCY = END_TX.SECONDARY_CCY AND
NVL(START_TX.CORPORATE_DEALER,'nullX')=NVL(END_TX.CORPORATE_DEALER,'nullX') AND
START_TX.ORIENTATION_BUYSELL='B' AND
END_TX.ORIENTATION_BUYSELL='S' AND
START_TX.FX_TRAN_ID = 1850718 AND
(START_TX.BASE_CCY_AMT = END_TX.BASE_CCY_AMT
OR
START_TX.SECONDARY_CCY_AMT = END_TX.SECONDARY_CCY_AMT) -- 10 Rows
UNION
SELECT
START_TX.FX_TRAN_ID START_FX_TRAN_ID
,END_TX.FX_TRAN_ID END_FX_TRAN_ID
,START_TX.ENTERED_DT_TS
,USER
,START_TX.TRADE_DT
,START_TX.DEAL_NUMBER
,START_TX.FX_DEAL_TYPE
,START_TX.ORIENTATION_BUYSELL
,START_TX.BASE_CCY
,START_TX.BASE_CCY_AMT
,START_TX.SECONDARY_CCY
,START_TX.SECONDARY_CCY_AMT
,START_TX.MATURITY_DT
,START_TX.TRADE_RT
,START_TX.FORWARD_PTS
,START_TX.CORPORATE_PIPS
,START_TX.DEAL_OWNER_INITIALS
,START_TX.CORPORATE_DEALER
,START_TX.PROFIT_CENTER_CD
,START_TX.COUNTERPARTY_NM
,START_TX.COUNTERPARTY_NUMBER
FROM
(SELECT * FROM FX_TRANSACTIONS WHERE GMT_CONV_ENTERED_DT_TS >= TO_DATE('20-Nov-2013 4:00:01 AM','DD-Mon-YYYY HH:MI:SS AM')) START_TX
INNER JOIN
(SELECT * FROM FX_TRANSACTIONS WHERE GMT_CONV_ENTERED_DT_TS <= TO_DATE('20-Nov-2013 4:59:59 PM','DD-Mon-YYYY HH:MI:SS AM')) END_TX
ON START_TX.COUNTERPARTY_NM = END_TX.COUNTERPARTY_NM AND
START_TX.COUNTERPARTY_NUMBER = END_TX.COUNTERPARTY_NUMBER AND
START_TX.FX_DEAL_TYPE = END_TX.FX_DEAL_TYPE AND
START_TX.BASE_CCY = END_TX.BASE_CCY AND
START_TX.SECONDARY_CCY = END_TX.SECONDARY_CCY AND
NVL(START_TX.CORPORATE_DEALER,'nullX')=NVL(END_TX.CORPORATE_DEALER,'nullX') AND
START_TX.FX_TRAN_ID = 1850718 AND
START_TX.ORIENTATION_BUYSELL='B' AND
END_TX.ORIENTATION_BUYSELL='S' -- 67 Rows
UNION
SELECT
START_TX.FX_TRAN_ID START_FX_TRAN_ID
,END_TX.FX_TRAN_ID END_FX_TRAN_ID
,START_TX.ENTERED_DT_TS
,USER
,START_TX.TRADE_DT
,START_TX.DEAL_NUMBER
,START_TX.FX_DEAL_TYPE
,START_TX.ORIENTATION_BUYSELL
,START_TX.BASE_CCY
,START_TX.BASE_CCY_AMT
,START_TX.SECONDARY_CCY
,START_TX.SECONDARY_CCY_AMT
,START_TX.MATURITY_DT
,START_TX.TRADE_RT
,START_TX.FORWARD_PTS
,START_TX.CORPORATE_PIPS
,START_TX.DEAL_OWNER_INITIALS
,START_TX.CORPORATE_DEALER
,START_TX.PROFIT_CENTER_CD
,START_TX.COUNTERPARTY_NM
,START_TX.COUNTERPARTY_NUMBER
FROM
(SELECT * FROM FX_TRANSACTIONS WHERE GMT_CONV_ENTERED_DT_TS >= TO_DATE('20-Nov-2013 4:00:01 AM','DD-Mon-YYYY HH:MI:SS AM')) START_TX
INNER JOIN
(SELECT * FROM FX_TRANSACTIONS WHERE GMT_CONV_ENTERED_DT_TS <= TO_DATE('20-Nov-2013 4:59:59 PM','DD-Mon-YYYY HH:MI:SS AM')) END_TX
ON START_TX.COUNTERPARTY_NM = END_TX.COUNTERPARTY_NM AND
START_TX.COUNTERPARTY_NUMBER = END_TX.COUNTERPARTY_NUMBER AND
START_TX.FX_DEAL_TYPE = END_TX.FX_DEAL_TYPE AND
START_TX.BASE_CCY = END_TX.BASE_CCY AND
START_TX.SECONDARY_CCY = END_TX.SECONDARY_CCY AND
NVL(START_TX.CORPORATE_DEALER,'nullX')=NVL(END_TX.CORPORATE_DEALER,'nullX') AND
START_TX.ORIENTATION_BUYSELL='B' AND
END_TX.ORIENTATION_BUYSELL='S' AND
START_TX.FX_TRAN_ID = 1850718 AND
END_TX.BASE_CCY_AMT BETWEEN (START_TX.BASE_CCY_AMT - (START_TX.BASE_CCY_AMT * :PERC_DEV/100)) AND (START_TX.BASE_CCY_AMT + (START_TX.BASE_CCY_AMT * :PERC_DEV/100))
OR
END_TX.SECONDARY_CCY_AMT BETWEEN (START_TX.SECONDARY_CCY_AMT - (START_TX.SECONDARY_CCY_AMT*:PERC_DEV/100) ) AND (START_TX.SECONDARY_CCY_AMT + (START_TX.SECONDARY_CCY_AMT*:PERC_DEV/100))
); --- 10 Rows -
Having clause with Analytic function
can you pls let me know if we can use HAVING clause with analytic function
select eid,empno,sum(sal) over(partition by year)
from employee
where dept = 'SALES'
having sum(sal) > 10000I m getting error while using the above,
IS that we can use HAVING clause with partition by
Thanks in advanceYour having clause isn't using an analytical function, is using a regular aggregate function.
You also can't use analytical functions in the where clause or having clause like that as they are windowing functions and belong at the top of the query.
You would have to wrap the query to achieve what you want e.g.
SQL> ed
Wrote file afiedt.buf
1 select deptno, total_sal
2 from (
3 select deptno,sum(sal) over (partition by deptno) as total_sal
4 from emp
5 )
6 group by deptno, total_sal
7* having total_sal > 10000
SQL> /
DEPTNO TOTAL_SAL
20 10875
SQL> -
Help with analytical function (ora 9...)
Hi everyone, is there a way to fill some missing numbers based on what have come before and after that missing number by starttime and based on how many missing data are between? ... by "simple" select? I know how to do that just theoreticly with simple math commands, but is there a way to apply them in sql (analytical functions)?
Thanks in advance for any ideas !
The missing number on line 17 could be calculated as 339+(1/2)*(356-339) = 347,5
The missing number on line 23 could be calculated as 355+(1/3)*(292-355) = 334
The missing number on line 24 could be calculated as 355+(2/3)*(292-355) = 313
rownumber + temp_table (starttime,data_column)
15 23.5.2007 16:15 , 258
16 23.5.2007 16:30 , 339
17 23.5.2007 16:45 ,
18 23.5.2007 17:00 , 356
19 23.5.2007 17:15 , 373
20 23.5.2007 17:30 , 355
21 23.5.2007 17:45 , 363
22 23.5.2007 18:00 , 355
23 23.5.2007 18:15 ,
24 23.5.2007 18:30 ,
25 23.5.2007 19:00 , 292
26 23.5.2007 19:15 , 295
THANKS
Message was edited by:
dusooWay too late, but I wouldn't let my effort go unpublished ;-)
SQL> create table temp_table
2 as
3 select 15 rownumber, to_date('23.5.2007 16:15','dd.mm.yyyy hh24:mi') starttime, 258 data_column from dual union all
4 select 16, to_date(' 23.5.2007 16:30','dd.mm.yyyy hh24:mi'), 339 from dual union all
5 select 17, to_date(' 23.5.2007 16:45','dd.mm.yyyy hh24:mi'), null from dual union all
6 select 18, to_date(' 23.5.2007 17:00','dd.mm.yyyy hh24:mi'), 356 from dual union all
7 select 19, to_date(' 23.5.2007 17:15','dd.mm.yyyy hh24:mi'), 373 from dual union all
8 select 20, to_date(' 23.5.2007 17:30','dd.mm.yyyy hh24:mi'), 355 from dual union all
9 select 21, to_date(' 23.5.2007 17:45','dd.mm.yyyy hh24:mi'), 363 from dual union all
10 select 22, to_date(' 23.5.2007 18:00','dd.mm.yyyy hh24:mi'), 355 from dual union all
11 select 23, to_date(' 23.5.2007 18:15','dd.mm.yyyy hh24:mi'), null from dual union all
12 select 24, to_date(' 23.5.2007 18:30','dd.mm.yyyy hh24:mi'), null from dual union all
13 select 25, to_date(' 23.5.2007 19:00','dd.mm.yyyy hh24:mi'), 292 from dual union all
14 select 26, to_date(' 23.5.2007 19:15','dd.mm.yyyy hh24:mi'), 295 from dual
15 /
Tabel is aangemaakt.
SQL> with t as
2 ( select t.*
3 , max(case when data_column is not null then rownumber end) over (order by rownumber) lowerbound
4 , last_value(data_column ignore nulls) over (order by rownumber) prevvalue
5 , min(case when data_column is not null then rownumber end) over (order by rownumber desc) upperbound
6 , last_value(data_column ignore nulls) over (order by rownumber desc) nextvalue
7 from temp_table t
8 )
9 select rownumber
10 , starttime
11 , case
12 when data_column is not null then data_column
13 else prevvalue * ((upperbound - rownumber) / (upperbound - lowerbound))
14 + nextvalue * ((rownumber - lowerbound) / (upperbound - lowerbound))
15 end data_column
16 from t
17 order by rownumber
18 /
ROWNUMBER STARTTIME DATA_COLUMN
15 23-05-2007 16:15:00 258
16 23-05-2007 16:30:00 339
17 23-05-2007 16:45:00 347,5
18 23-05-2007 17:00:00 356
19 23-05-2007 17:15:00 373
20 23-05-2007 17:30:00 355
21 23-05-2007 17:45:00 363
22 23-05-2007 18:00:00 355
23 23-05-2007 18:15:00 334
24 23-05-2007 18:30:00 313
25 23-05-2007 19:00:00 292
26 23-05-2007 19:15:00 295
12 rijen zijn geselecteerd.Regards,
Rob. -
Speed up query with analytic function
Hi
how can I speed up the query below ?
All time is in analytic function (WINDOW SORT)
Thanks for your help
11.2.0.1
Rows Row Source Operation
28987 HASH UNIQUE (cr=12677 pr=155778 pw=109730 time=25010 us cost=5502 size=3972960 card=14880)
1668196 WINDOW SORT (cr=12677 pr=155778 pw=109730 time=890411840 us cost=5502 size=3972960 card=14880)
1668196 HASH JOIN RIGHT OUTER (cr=12677 pr=0 pw=0 time=1069165 us cost=3787 size=3972960 card=14880)
30706 TABLE ACCESS FULL FLO_FML_EVENT (cr=270 pr=0 pw=0 time=7420 us cost=56 size=814158 card=30154)
194733 HASH JOIN RIGHT OUTER (cr=12407 pr=0 pw=0 time=571145 us cost=3730 size=3571200 card=14880)
613 VIEW (cr=342 pr=0 pw=0 time=489 us cost=71 size=23840 card=745)
613 HASH UNIQUE (cr=342 pr=0 pw=0 time=244 us cost=71 size=20115 card=745)
745 WINDOW SORT (cr=342 pr=0 pw=0 time=1736 us cost=71 size=20115 card=745)
745 MAT_VIEW ACCESS FULL MVECRF_CUR_QUERY (cr=342 pr=0 pw=0 time=1736 us cost=69 size=20115 card=745)
194733 HASH JOIN (cr=12065 pr=0 pw=0 time=431813 us cost=3658 size=3095040 card=14880)
43 MAT_VIEW ACCESS FULL MVECRF_VISIT_REVS (cr=3 pr=0 pw=0 time=0 us cost=2 size=946 card=43)
194733 HASH JOIN OUTER (cr=12062 pr=0 pw=0 time=292098 us cost=3656 size=2767680 card=14880)
194733 HASH JOIN OUTER (cr=10553 pr=0 pw=0 time=234394 us cost=2962 size=2574240 card=14880)
194733 HASH JOIN (cr=9999 pr=0 pw=0 time=379996 us cost=2570 size=2380800 card=14880)
30076 MAT_VIEW ACCESS FULL MVECRF_ACTIVATED_FORMS (cr=1817 pr=0 pw=0 time=28411 us cost=361 size=2000285 card=29855)
194733 HASH JOIN (cr=8182 pr=0 pw=0 time=209061 us cost=1613 size=9026301 card=97057)
628 MAT_VIEW ACCESS FULL MVECRF_STUDYVERSION_FORMS (cr=19 pr=0 pw=0 time=250 us cost=6 size=18212 card=628)
194733 MAT_VIEW ACCESS FULL MVECRF_FORMITEMS (cr=8163 pr=0 pw=0 time=80733 us cost=1606 size=12462912 card=194733)
132342 MAT_VIEW ACCESS FULL MVECRF_ITEM_SDV (cr=554 pr=0 pw=0 time=23678 us cost=112 size=1720446 card=132342)
221034 MAT_VIEW ACCESS FULL MVECRF_ITEMDATA (cr=1509 pr=0 pw=0 time=46459 us cost=299 size=2873442 card=221034)
SELECT
DISTINCT
'CL238093011' AS ETUDE,
FI.STUDYID,
FI.STUDYVERSIONID,
FI.SITEID,
FI.SUBJECTID,
FI.VISITID,
VR.VISITREFNAME,
FI.SUBJECTVISITID,
FI.FORMID,
FI.FORMINDEX,
SVF.FORMREFNAME,
SVF.FORMMNEMONIC AS FMLNOM,
EVENT_ITEM.EVENT AS EVENUM,
EVENT_ITEM.EVENT_ROW AS LIGNUM,
NULL AS CODVISEVE,
MIN(DID.MINENTEREDDATE)
OVER (
PARTITION BY FI.SUBJECTID, FI.VISITID, FI.FORMID, FI.FORMINDEX
AS ATTDAT1ERSAI,
MIN(IFSDV.ITEMFIRSTSDV)
OVER (
PARTITION BY FI.SUBJECTID, FI.VISITID, FI.FORMID, FI.FORMINDEX
AS ATTDAT1ERSDV,
MAX(IFSDV.ITEMFIRSTSDV)
OVER (
PARTITION BY FI.SUBJECTID, FI.VISITID, FI.FORMID, FI.FORMINDEX
AS ATTDATDERSDV,
DECODE (AF.SDVCOMPLETESTATE,
0,
'N',
1,
'Y')
AS ATTINDSDVCOP,
AF.FMINSDVCOMPLETESTATE AS ATTDAT1ERSDVCOP,
DECODE (AF.SDVPARTIALSTATE,
0,
'N',
1,
'Y')
AS ATTINDSDVPTL,
EVENT_ITEM.EVENT_RELECT AS ATTINDRVUMEDCOP,
DECODE (QUERY.NBQSTFML, NULL, 'N', 'Y') AS ATTINDQST,
DECODE (AF.MISSINGITEMSSTATE,
0,
'N',
1,
'Y')
AS ATTINDITMABS,
DECODE (AF.FROZENSTATE,
0,
'N',
1,
'Y')
AS ATTINDETACON,
AF.FMINFROZENSTATE AS ATTDAT1ERCON,
AF.FMAXFROZENSTATE AS ATTDATDERCON,
DECODE (AF.DELETEDSTATE,
0,
'N',
1,
'Y')
AS ATTINDETASPR,
EVENT_ITEM.ROW_DELETED AS ATTINDLIGSPR
FROM CL238093011.MVECRF_FORMITEMS FI,
CL238093011.MVECRF_STUDYVERSION_FORMS SVF,
CL238093011.MVECRF_ACTIVATED_FORMS AF,
CL238093011.MVECRF_ITEM_SDV IFSDV,
CL238093011.MVECRF_VISIT_REVS VR,
CL238093011.MVECRF_ITEMDATA DID,
(SELECT DISTINCT
SUBJECTID,
VISITID,
FORMID,
FORMINDEX,
COUNT (
DISTINCT QUERYID
OVER (
PARTITION BY SUBJECTID, VISITID, FORMID, FORMINDEX
NBQSTFML
FROM CL238093011.MVECRF_CUR_QUERY
WHERE QUERYSTATE IN (0, 1, 2)) QUERY,
CL238093011.FLO_FML_EVENT EVENT_ITEM
WHERE (AF.VISITDELETED IS NULL OR AF.VISITDELETED = 0)
AND AF.FORMTYPE NOT IN (4, 5, 6, 7, 8, 103)
AND (AF.DELETEDDYNAMICFORMSTATE IS NULL
OR AF.DELETEDDYNAMICFORMSTATE = 0)
AND FI.SUBJECTVISITID = AF.SUBJECTVISITID
AND FI.FORMID = AF.FORMID
AND FI.FORMREV = AF.FORMREV
AND FI.FORMINDEX = AF.FORMINDEX
AND FI.VISITID = VR.VISITID
AND FI.VISITREV = VR.VISITREV
AND FI.CONTEXTID = IFSDV.CONTEXTID(+)
AND FI.CONTEXTID = DID.CONTEXTID(+)
AND FI.SUBJECTID = QUERY.SUBJECTID(+)
AND FI.VISITID = QUERY.VISITID(+)
AND FI.FORMID = QUERY.FORMID(+)
AND FI.FORMINDEX = QUERY.FORMINDEX(+)
AND FI.STUDYVERSIONID = SVF.STUDYVERSIONID
AND FI.FORMID = SVF.FORMID
AND FI.VISITID = SVF.VISITID
AND FI.SUBJECTID = EVENT_ITEM.SUBJECTID(+)
AND FI.VISITID = EVENT_ITEM.VISITID(+)
AND FI.FORMID = EVENT_ITEM.FORMID(+)
AND FI.FORMINDEX = EVENT_ITEM.FORMINDEX(+)user12045475 wrote:
Hi
how can I speed up the query below ?
All time is in analytic function (WINDOW SORT)
Thanks for your help
11.2.0.1
Rows Row Source Operation
28987 HASH UNIQUE (cr=12677 pr=155778 pw=109730 time=25010 us cost=5502 size=3972960 card=14880)
1668196 WINDOW SORT (cr=12677 pr=155778 pw=109730 time=890411840 us cost=5502 size=3972960 card=14880)
1668196 HASH JOIN RIGHT OUTER (cr=12677 pr=0 pw=0 time=1069165 us cost=3787 size=3972960 card=14880)
30706 TABLE ACCESS FULL FLO_FML_EVENT (cr=270 pr=0 pw=0 time=7420 us cost=56 size=814158 card=30154)
194733 HASH JOIN RIGHT OUTER (cr=12407 pr=0 pw=0 time=571145 us cost=3730 size=3571200 card=14880)
613 VIEW (cr=342 pr=0 pw=0 time=489 us cost=71 size=23840 card=745)
613 HASH UNIQUE (cr=342 pr=0 pw=0 time=244 us cost=71 size=20115 card=745)
745 WINDOW SORT (cr=342 pr=0 pw=0 time=1736 us cost=71 size=20115 card=745)
745 MAT_VIEW ACCESS FULL MVECRF_CUR_QUERY (cr=342 pr=0 pw=0 time=1736 us cost=69 size=20115 card=745)
194733 HASH JOIN (cr=12065 pr=0 pw=0 time=431813 us cost=3658 size=3095040 card=14880)
43 MAT_VIEW ACCESS FULL MVECRF_VISIT_REVS (cr=3 pr=0 pw=0 time=0 us cost=2 size=946 card=43)
194733 HASH JOIN OUTER (cr=12062 pr=0 pw=0 time=292098 us cost=3656 size=2767680 card=14880)
194733 HASH JOIN OUTER (cr=10553 pr=0 pw=0 time=234394 us cost=2962 size=2574240 card=14880)
194733 HASH JOIN (cr=9999 pr=0 pw=0 time=379996 us cost=2570 size=2380800 card=14880)
30076 MAT_VIEW ACCESS FULL MVECRF_ACTIVATED_FORMS (cr=1817 pr=0 pw=0 time=28411 us cost=361 size=2000285 card=29855)
194733 HASH JOIN (cr=8182 pr=0 pw=0 time=209061 us cost=1613 size=9026301 card=97057)
628 MAT_VIEW ACCESS FULL MVECRF_STUDYVERSION_FORMS (cr=19 pr=0 pw=0 time=250 us cost=6 size=18212 card=628)
194733 MAT_VIEW ACCESS FULL MVECRF_FORMITEMS (cr=8163 pr=0 pw=0 time=80733 us cost=1606 size=12462912 card=194733)
132342 MAT_VIEW ACCESS FULL MVECRF_ITEM_SDV (cr=554 pr=0 pw=0 time=23678 us cost=112 size=1720446 card=132342)
221034 MAT_VIEW ACCESS FULL MVECRF_ITEMDATA (cr=1509 pr=0 pw=0 time=46459 us cost=299 size=2873442 card=221034)
SELECT
DISTINCT
'CL238093011' AS ETUDE,
FI.STUDYID,
FI.STUDYVERSIONID,
FI.SITEID,
FI.SUBJECTID,
FI.VISITID,
VR.VISITREFNAME,
FI.SUBJECTVISITID,
FI.FORMID,
FI.FORMINDEX,
SVF.FORMREFNAME,
SVF.FORMMNEMONIC AS FMLNOM,
EVENT_ITEM.EVENT AS EVENUM,
EVENT_ITEM.EVENT_ROW AS LIGNUM,
NULL AS CODVISEVE,
MIN(DID.MINENTEREDDATE)
OVER (
PARTITION BY FI.SUBJECTID, FI.VISITID, FI.FORMID, FI.FORMINDEX
AS ATTDAT1ERSAI,
MIN(IFSDV.ITEMFIRSTSDV)
OVER (
PARTITION BY FI.SUBJECTID, FI.VISITID, FI.FORMID, FI.FORMINDEX
AS ATTDAT1ERSDV,
MAX(IFSDV.ITEMFIRSTSDV)
OVER (
PARTITION BY FI.SUBJECTID, FI.VISITID, FI.FORMID, FI.FORMINDEX
AS ATTDATDERSDV,
DECODE (AF.SDVCOMPLETESTATE,
0,
'N',
1,
'Y')
AS ATTINDSDVCOP,
AF.FMINSDVCOMPLETESTATE AS ATTDAT1ERSDVCOP,
DECODE (AF.SDVPARTIALSTATE,
0,
'N',
1,
'Y')
AS ATTINDSDVPTL,
EVENT_ITEM.EVENT_RELECT AS ATTINDRVUMEDCOP,
DECODE (QUERY.NBQSTFML, NULL, 'N', 'Y') AS ATTINDQST,
DECODE (AF.MISSINGITEMSSTATE,
0,
'N',
1,
'Y')
AS ATTINDITMABS,
DECODE (AF.FROZENSTATE,
0,
'N',
1,
'Y')
AS ATTINDETACON,
AF.FMINFROZENSTATE AS ATTDAT1ERCON,
AF.FMAXFROZENSTATE AS ATTDATDERCON,
DECODE (AF.DELETEDSTATE,
0,
'N',
1,
'Y')
AS ATTINDETASPR,
EVENT_ITEM.ROW_DELETED AS ATTINDLIGSPR
FROM CL238093011.MVECRF_FORMITEMS FI,
CL238093011.MVECRF_STUDYVERSION_FORMS SVF,
CL238093011.MVECRF_ACTIVATED_FORMS AF,
CL238093011.MVECRF_ITEM_SDV IFSDV,
CL238093011.MVECRF_VISIT_REVS VR,
CL238093011.MVECRF_ITEMDATA DID,
(SELECT DISTINCT
SUBJECTID,
VISITID,
FORMID,
FORMINDEX,
COUNT (
DISTINCT QUERYID
OVER (
PARTITION BY SUBJECTID, VISITID, FORMID, FORMINDEX
NBQSTFML
FROM CL238093011.MVECRF_CUR_QUERY
WHERE QUERYSTATE IN (0, 1, 2)) QUERY,
CL238093011.FLO_FML_EVENT EVENT_ITEM
WHERE (AF.VISITDELETED IS NULL OR AF.VISITDELETED = 0)
AND AF.FORMTYPE NOT IN (4, 5, 6, 7, 8, 103)
AND (AF.DELETEDDYNAMICFORMSTATE IS NULL
OR AF.DELETEDDYNAMICFORMSTATE = 0)
AND FI.SUBJECTVISITID = AF.SUBJECTVISITID
AND FI.FORMID = AF.FORMID
AND FI.FORMREV = AF.FORMREV
AND FI.FORMINDEX = AF.FORMINDEX
AND FI.VISITID = VR.VISITID
AND FI.VISITREV = VR.VISITREV
AND FI.CONTEXTID = IFSDV.CONTEXTID(+)
AND FI.CONTEXTID = DID.CONTEXTID(+)
AND FI.SUBJECTID = QUERY.SUBJECTID(+)
AND FI.VISITID = QUERY.VISITID(+)
AND FI.FORMID = QUERY.FORMID(+)
AND FI.FORMINDEX = QUERY.FORMINDEX(+)
AND FI.STUDYVERSIONID = SVF.STUDYVERSIONID
AND FI.FORMID = SVF.FORMID
AND FI.VISITID = SVF.VISITID
AND FI.SUBJECTID = EVENT_ITEM.SUBJECTID(+)
AND FI.VISITID = EVENT_ITEM.VISITID(+)
AND FI.FORMID = EVENT_ITEM.FORMID(+)
AND FI.FORMINDEX = EVENT_ITEM.FORMINDEX(+)
Do you have the license for parallel query (may/may not help)? PQO can help with sorts ... -
SQL Query With analytical function
Hi
Below is the scenario which i am looking for in sql query using analytical functions
I/p
Col1
50
0
-150
-200
300
-100
-300
500
-100
O/p
Col1 col2
50 0
0 0
-150 -100
-200 -200
300 0
-100 0
-300 -100
500 400
-100 0Any help really appreciated
Thanks in advance
Edited by: unique on Aug 10, 2010 4:53 AM
Edited by: unique on Aug 10, 2010 4:55 AM
Edited by: unique on Aug 10, 2010 4:55 AMOh,In this case,There is OLAP solution ;-)
OLAP samples of my homepage http://www.geocities.jp/oraclesqlpuzzle/oracle-sql1-olap.html
with work(SK,Val) as(
select 1, 50 from dual union
select 2, 0 from dual union
select 3,-150 from dual union
select 4,-200 from dual union
select 5, 300 from dual union
select 6,-100 from dual union
select 7,-300 from dual union
select 8, 500 from dual union
select 9,-100 from dual)
select SK,Val,GID,
case when Val > 0
then greatest(0,sum(Val) over(partition by GID))
else Least(0,Val+greatest(0,sum(Val) over(partition by GID
order by SK rows between unbounded preceding
and 1 preceding)))
end as COL3
from (select SK,Val,
sum(greatest(0,sign(Val))) over(order by SK) as GID
from work)
order by SK;
SK VAL GID COL3
1 50 1 0
2 0 1 0
3 -150 1 -100
4 -200 1 -200
5 300 2 0
6 -100 2 0
7 -300 2 -100
8 500 3 400
9 -100 3 0 -
Help needed with analytical function
I want to get the employee details of the highest and 2nd highest salaried employee in a particular department. But also the department should have more than 1 employee.
I tried the query and it gave me proper results. But I'm wondering if there is some other alternative than using the subquery.
Here is the table and the result query :
with t as
select 1 emp_id,3 mgr_id,'Rajesh' emp_name,3999 salary,677 bonus,'HR' dpt_nme from dual union
select 2 ,3 ,'Gangz',4500,800,'Finance' from dual union
select 3 ,4 ,'Sid',8000,12000,'IT' from dual union
select 4 ,null,'Ram',5000,677,'HR' from dual union
select 5 ,4,'Shyam',6000,677,'IT' from dual union
select 6 ,4 ,'Ravi',9000,12000,'IT' from dual
select * from
(select emp_id, mgr_id, emp_name, dpt_nme, salary, row_number() over (partition by dpt_nme order by salary desc) rn from t where dpt_nme in
(select dpt_nme from t group by dpt_nme having count(*) > 1)) where rn < 3Hi,
You need a sub-query, but you don't need more than that.
Here's one way to eliminate the extra sub-query:
WITH got_analytics AS
SELECT emp_id, mgr_id, emp_name, dpt_nme, salary
, ROW_NUMBER () OVER ( PARTITION BY dpt_nme
ORDER BY salary DESC
) AS rn
, COUNT (*) OVER ( PARTITION BY dpt_nme
) AS dpt_cnt
FROM t
SELECT emp_id, mgr_id, emp_name, dpt_nme, salary
, rn
FROM got_analytics
WHERE rn < 3
AND dpt_cnt > 1
;Analytic functions are computed after the WHERE clause is applied. Since we need to use the results of the analytic ROW_NUMBER function in a WHERE clause, that means we'll have to compute ROW_NUMBER in a sub-query, and use the results in the WHERE clause of the main query. We can call the analytic COUNT function in the same sub-query, and use its results in the same WHERE clause of the main query.
What results would you want if there's a tie for the 2nd highest salary in some department? For example, if you add this row to your sample data:
select 7 ,3 ,'Sunil',8000,12000,'IT' from dual union? You may want to use RANK instead of ROW_NUMBER. -
I successfully use the following analytical function to sum all net_movement of a position (key for a position: bp_id, prtfl_num, instrmnt_id, cost_prc_crncy) from first occurrence until current row:
SELECT SUM (net_movement) OVER (PARTITION BY bp_id, prtfl_num, instrmnt_id, cost_prc_crncy ORDER BY TRUNC (val_dt) RANGE BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING) holding,
what i need is another column to sum net_movement of a position but only for the current date, but all my approaches fail..
- add the date (val_dt) to the 'partition by' clause and therefore sum only values with same position and date
SELECT SUM (net_movement) OVER (PARTITION BY val_dt, bp_id, prtfl_num, instrmnt_id, cost_prc_crncy ORDER BY TRUNC (val_dt) RANGE BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING) today_net_movement
- take the holding for the last date and subtract it from the current holding afterwards
SELECT SUM (net_movement) OVER (PARTITION BY bp_id, prtfl_num, instrmnt_id, cost_prc_crncy ORDER BY TRUNC (val_dt) RANGE BETWEEN UNBOUNDED PRECEDING AND -1 FOLLOWING) last_holding,
- using lag on the analytical function which calculates holding fails too
I also want to avoid creating a table which stores the last holding..
Does anyone sees where I make a mistake or knows an alternative to get this value?
It would help me much!
Thanks in advance!Thank you,
but I already tried that but it returns strange values which are not the correct ones for sure.
It is always the same value for each row, if its not 0, and a very high one (500500 for example), even if the sum of all net_movement of that date is 0 (and the statement for holding returns 0 too)
I also tried witch trunc(val_dt,'DDD') with the same result (without trunc it is the same issue)
please help if you can, thanks in advance! -
Tuning sql with analytic function
Dear friends I've developed one sql :
with REP as
(select /*+ MATERIALIZE */ branch_code,
row_number() over(partition by branch_code, account order by bkg_date desc ) R,
account,
bkg_date,
lcy_closing_bal
from history t
select REP1.branch_code,
REP1.account,
REP1.bkg_date,
REP1.lcy_closing_bal,
NULL AS second,
REP2.bkg_date bkg_date2,
REP2.lcy_closing_bal lcy_closing_bal2,
NULL AS third,
REP3.bkg_date bkg_date3,
REP3.lcy_closing_bal lcy_closing_bal3
from (SELECT * FROM REP WHERE R=1) REP1, (SELECT * FROM REP WHERE R=2) REP2, (SELECT * FROM REP WHERE R=3) REP3
where
(REP1.BRANCH_CODE = REP2.BRANCH_CODE(+) AND REP1.ACCOUNT = REP2.ACCOUNT(+)) AND
(REP1.BRANCH_CODE = REP3.BRANCH_CODE(+) AND REP1.ACCOUNT = REP3.ACCOUNT(+))The point is I want to restrict (tune) REP before it used ,because , as you can see I need maximum three value from REP (where R=1,R=2,R=3) . Which analytic function and with wich options I have to use to receive only 3 values in each branch_code,account groups at the materializing time ?Radrigez wrote:
Dear friends I've developed one sql :
with REP as
from (SELECT * FROM REP WHERE R=1) REP1,
(SELECT * FROM REP WHERE R=2) REP2,
(SELECT * FROM REP WHERE R=3) REP3
where
(REP1.BRANCH_CODE = REP2.BRANCH_CODE(+) AND REP1.ACCOUNT = REP2.ACCOUNT(+)) AND
(REP1.BRANCH_CODE = REP3.BRANCH_CODE(+) AND REP1.ACCOUNT = REP3.ACCOUNT(+))
The first step is to put your subquery (which doesn't need to be materialized) into an inline view and restrict the result set on r in (1,2,3) as suggested by thtsang - you don't need to query the same result set three times.
Then you're looking at a simple pivot operation (assuming the number of rows you want per branch and account is fixed). If you're on 11g search the manuals for PIVOT, on earlier versions you can do this with a decode() or case() operator.
Step 1 (which could go into another factored subquery) would be something like:
select
branch_code, account,
case r = 1 then bkg_date end bkg_date,
case r = 1 then lcy_closing_bal end lcy_closing_bal,
case r = 2 then bkg_date end bkg_date2,
case r = 2 then lcy_closing_bal end lcy_closing_bal2,
case r = 3 then bkg_date end bkg_date3,
case r = 3 then lcy_closing_bal end lcy_closing_bal3
from
repThis gives you the eight necessary columns, but still (up to) three rows per branch/account.
Then you aggregate this (call it rep1) on branch and account.
select
branch_code, account,
max(bkg_date),
max(lcy_closing_bal),
max(bkg_date2),
max(lcy_closing_bal2),
max(bkg_date3),
max(lcy_closing_bal3)
from
rep1
group by
branch_code, account
order by
branch_code, accountRegards
Jonathan Lewis
http://jonathanlewis.wordpress.com
Author: <b><em>Oracle Core</em></b> -
I need help with Analytic Function
Hi,
I have this little problem that I need help with.
My datafile has thousands of records that look like...
Client_Id Region Countries
[1] [1] [USA, Canada]
[1] [2] [Australia, France, Germany]
[1] [3] [China, India, Korea]
[1] [4] [Brazil, Mexico]
[8] [1] [USA, Canada]
[9] [1] [USA, Canada]
[9] [4] [Argentina, Brazil]
[13] [1] [USA, Canada]
[15] [1] [USA]
[15] [4] [Argentina, Brazil]
etc
My task is is to create a report with 2 columns - Client_Id and Countries, to look something like...
Client_Id Countries
[1] [USA, Canada, Australia, France, Germany, China, India, Korea, Brazil, Mexico]
[8] [USA, Canada]
[9] [USA, Canada, Argentina, Brazil]
[13] [USA, Canada]
[15] [USA, Argentina, Brazil]
etc.
How can I achieve this using Analytic Function(s)?
Thanks.
BDFHi,
That's called String Aggregation , and the following site shows many ways to do it:
http://www.oracle-base.com/articles/10g/StringAggregationTechniques.php
Which one should you use? That depends on which version of Oracle you're using, and your exact requirements.
For example, is order importatn? You said the results shoudl include:
CLIENT_ID COUNTRIES
1 USA, Canada, Australia, France, Germany, China, India, Korea, Brazil, Mexicobut would you be equally happy with
CLIENT_ID COUNTRIES
1 Australia, France, Germany, China, India, Korea, Brazil, Mexico, USA, Canadaor
CLIENT_ID COUNTRIES
1 Australia, France, Germany, USA, Canada, Brazil, Mexico, China, India, Korea?
Mwalimu wrote:
... How can I achieve this using Analytic Function(s)?The best solution may not involve analytic functions at all. Is that okay?
If you'd like help, post your best attempt, a little sample data (CREATE TABLE and INSERT statements), the results you want from that data, and an explanation of how you get those results from that data.
Always say which version of Oracle you're using.
Edited by: Frank Kulash on Aug 29, 2011 3:05 PM -
Problem with Analytical function
hi,
I have two tables and my expected result is given below..
I used the LEAD function to get (start_Date and new_Date) which i have shown in my expected result..my problem is with rel_type and org_id. I am not able to get those values to its corresponding dates..please can any one help...
Table A
ID START_DATE END_DATE REL_TYPE
5001 5/12/2005 7/1/2005 PARTIAL
5001 7/1/2005 7/4/2005 NOTHING
5001 7/4/2005 1/1/5000 FULL
Table B
ID ORG_ID START_DATE END_DATE
5001 102 3/1/2002 3/10/2004
5001 103 3/10/2004 8/1/2005
5001 102 8/1/2005 1/1/5000
Expected Result
start_Date new_date rel_type org_id
3/1/2002 3/10/2004 partial 102
3/10/2004 5/12/2005 partial 103
5/12/2005 7/1/2005 partial 103
7/1/2005 7/4/2005 Nothing 103
7/4/2005 8/1/2005 FULL 103
8/1/2005 1/1/5000 FULL 102
rds,
NagaIs this correct?
<s></s>
with A as
( select 5001 id ,to_date('5/12/2005') start_date, to_date('7/1/2005') end_date,'PERTIAL' rel_type from dual
union all
select 5001,to_date('7/1/2005'),to_date('7/4/2005'), 'NOTHING' from dual
union all
select 5001,to_date('7/4/2005'),to_date('1/1/5000'), 'FULL' from dual
,B as
( select 5001 id ,102 org_id, to_date('3/1/2005') start_date, to_date('3/10/2005') end_date from dual
union all
select 5001, 103, to_date('3/10/2005'),to_date('8/1/2005') from dual
union all
select 5001, 102, to_date('8/1/2005'),to_date('1/1/5000') from dual
/* Data end */
select
start_date
,case when rel_type is null then lead(start_date) over (order by start_date)
else new_date end NEW_DATE
,last_value(rel_type ignore nulls)
over (order by start_date desc rows unbounded preceding) REL_TYPE
,org_id
from (
select
case when B.start_date < A.start_date then A.start_date else B.start_date end START_DATE
,case when B.end_date > A.end_date then A.end_date else B.end_date end NEW_DATE
,A.rel_type
,B.org_id
from A,B
where A.start_date <= B.end_date and B.start_date <= a.end_date
union all
select B.start_date, B.end_date, null, B.org_id
from B
where start_date <= all (select start_date from A)
order by start_date,org_id
START_DATE NEW_DATE REL_TYP ORG_ID
03/01/2005 03/10/2005 PERTIAL 102
03/10/2005 05/12/2005 PERTIAL 103
05/12/2005 07/01/2005 PERTIAL 103
07/01/2005 07/04/2005 NOTHING 103
07/04/2005 08/01/2005 FULL 103
08/01/2005 01/01/5000 FULL 102
6 rows selected.
Oops, there were mistakes on START_DATE NEW_DATE
It has been corrected.
Message was edited by:
ushitaki -
Help required with Analytic function
Hi I have a table like following
column1 column2 column3 cloumn4 start_Date
1 601 A B 10-jan-2007
2 601 A B 11 -jan-2007
1 602 A B 12-jan-007
1 603 A C 12-jan-2007
there is no Uk on this table.
now I have to group column2 ,column3 ,column4.
I finally need to get the row that has highest start date. Effectively meaming
there will be three groups based on abouve data:
1st is:
1 601 A B 10-jan-2007
2 601 A B 11 -jan-2007
2nd is
1 602 A B 12-jan-007
3rd is
1 603 A C 12-jan-2007
now i need to get the second row from the first group only
2 601 A B 11 -jan-2007
i dont need data from other groups since they have less than 2 rows.
How can I achieve this using analytics function.
Please help!!Hi,
Can you please provide an example. I am sorry, this
is my first day with analytice :(I figured as much; that's why I gave you detailed instructions to gain some experience by building on the
query that Forms already gave you (slightly prettied up below):
select *
from ( -- Begin sub-query
SELECT column1,column2,column3,column4
, row_number () over
( partition by column2,column3,column4
order by start_date desc
) as rnk -- "rank" is not a good name
from table
) -- End sub-query
where rnk = 1;
[pre]
Follow the instructions I gave you earlier.
Add the analytic "COUNT (*) OVER (...) AS cnt" function next to the analytic ROW_NUMBER function in Forms' query.
Add the test for "cnt >= 2" next to the test for "rnk = 1". -
Hello.
I am not used to anaylitic funtions and after reading a lot about them I am very confused.
I have a situation similar to the test_table I post below, I have a table with 2 columns event_code (number) and event_date (date) which make the primary key. I need to see all the event_code's and event_date's of the table, I also need to compare the columns value1 and value2 so that if value1>value2 and event_date for that record belongs to september of 2008 it takes the value 1 (0 otherwise):
WITH test_table AS
(SELECT 1 event_code, ADD_MONTHS (SYSDATE - 1, -3) event_date, 1 value1,
1 value2
FROM DUAL
UNION
SELECT 1 event_code, ADD_MONTHS (SYSDATE - 1, -2) event_date, 3 value1,
2 value2
FROM DUAL
UNION
SELECT 1 event_code, ADD_MONTHS (SYSDATE - 1, -4) event_date,
100 value1, -1 value2
FROM DUAL
UNION
SELECT 2 event_code, ADD_MONTHS (SYSDATE - 2, -3) event_date,
122 value1, 1 value2
FROM DUAL
UNION
SELECT 2 event_code, ADD_MONTHS (SYSDATE - 2, -2) event_date,
133 value1, -4 value2
FROM DUAL
UNION
SELECT 2 event_code, ADD_MONTHS (SYSDATE - 2, -1) event_date,
1454 value1, 1 value2
FROM DUAL
UNION
SELECT 3 event_code, ADD_MONTHS (SYSDATE - 3, -3) event_date,
125 value1, 1 value2
FROM DUAL
UNION
SELECT 3 event_code, ADD_MONTHS (SYSDATE - 3, -2) event_date,
1888 value1, -1 value2
FROM DUAL
UNION
SELECT 3 event_code, ADD_MONTHS (SYSDATE - 3, -1) event_date,
144 value1, 1 value2
FROM DUAL)
SELECT event_code, event_date, value1, value2,
CASE
WHEN ( (value1 > value2) AND (event_date BETWEEN TO_DATE ('09/01/2008 00:00:00','mm/dd/yyyy hh24:mi:ss') AND TO_DATE ('09/30/2008 23:59:59','mm/dd/yyyy hh24:mi:ss')))
THEN 1
ELSE 0
END bigger
FROM test_table
EVENT_CODE EVENT_DA VALUE1 VALUE2 BIGGER
1 20/06/08 100 -1 0
1 20/07/08 1 1 0
1 20/08/08 3 2 0
2 19/07/08 122 1 0
2 19/08/08 133 -4 0
2 19/09/08 1454 1 1
3 18/07/08 125 1 0
3 18/08/08 1888 -1 0
3 18/09/08 144 1 1
9 rows selected.Finally and here comes my problem, I need to see, for each row, the maximun date for the event_code of the row whenever that maximun date belongs to september of 2008 (null otherwise), I have not been able to write that, this is the result I need to see:
EVENT_CODE EVENT_DATE VALUE1 VALUE2 BIGGER LAST_DATE
1 20/06/08 100 -1 0
1 20/07/08 1 1 0
1 20/08/08 3 2 0
2 19/07/08 122 1 0 19/09/08
2 19/08/08 133 -4 0 19/09/08
2 19/09/08 1454 1 1 19/09/08
3 18/07/08 125 1 0 18/09/08
3 18/08/08 1888 -1 0 18/09/08
3 18/09/08 144 1 1 18/09/08
9 rows selected.And this is my try (wrong):
/* Formatted on 2008/10/21 10:48 (Formatter Plus v4.8.8) */
WITH test_table AS
(SELECT 1 event_code, ADD_MONTHS (SYSDATE - 1, -3) event_date, 1 value1,
1 value2
FROM DUAL
UNION
SELECT 1 event_code, ADD_MONTHS (SYSDATE - 1, -2) event_date, 3 value1,
2 value2
FROM DUAL
UNION
SELECT 1 event_code, ADD_MONTHS (SYSDATE - 1, -4) event_date,
100 value1, -1 value2
FROM DUAL
UNION
SELECT 2 event_code, ADD_MONTHS (SYSDATE - 2, -3) event_date,
122 value1, 1 value2
FROM DUAL
UNION
SELECT 2 event_code, ADD_MONTHS (SYSDATE - 2, -2) event_date,
133 value1, -4 value2
FROM DUAL
UNION
SELECT 2 event_code, ADD_MONTHS (SYSDATE - 2, -1) event_date,
1454 value1, 1 value2
FROM DUAL
UNION
SELECT 3 event_code, ADD_MONTHS (SYSDATE - 3, -3) event_date,
125 value1, 1 value2
FROM DUAL
UNION
SELECT 3 event_code, ADD_MONTHS (SYSDATE - 3, -2) event_date,
1888 value1, -1 value2
FROM DUAL
UNION
SELECT 3 event_code, ADD_MONTHS (SYSDATE - 3, -1) event_date,
144 value1, 1 value2
FROM DUAL)
SELECT event_code, event_date, value1, value2,
CASE
WHEN ( (value1 > value2) AND (event_date BETWEEN TO_DATE ('09/01/2008 00:00:00','mm/dd/yyyy hh24:mi:ss') AND TO_DATE ('09/30/2008 23:59:59','mm/dd/yyyy hh24:mi:ss')))
THEN 1
ELSE 0
END bigger,
LAST_VALUE (event_date) OVER (PARTITION BY event_code ORDER BY event_date range between TO_DATE ('09/01/2008 00:00:00','mm/dd/yyyy hh24:mi:ss') PRECEDING and TO_DATE ('09/30/2008 23:59:59','mm/dd/yyyy hh24:mi:ss') FOLLOWING ) last_date
FROM test_tableThanks in advance.I have added a new column to my test_table value3 (number) and I need to see, for each row the value that that column has when it is in the record with has event_date=last_date for each code.
I have tried this:
SQL> r
1 WITH test_table AS
2 (SELECT 1 event_code, ADD_MONTHS (SYSDATE - 1, -3) event_date, 1 value1,
3 1 value2, 9 value3
4 FROM DUAL
5 UNION ALL
6 SELECT 1 event_code, ADD_MONTHS (SYSDATE - 1, -2) event_date, 3 value1,
7 2 value2, 8 value3
8 FROM DUAL
9 UNION ALL
10 SELECT 1 event_code, ADD_MONTHS (SYSDATE - 1, -4) event_date,
11 100 value1, -1 value2, 7 value3
12 FROM DUAL
13 UNION ALL
14 SELECT 2 event_code, ADD_MONTHS (SYSDATE - 2, -3) event_date,
15 122 value1, 1 value2, 6 value3
16 FROM DUAL
17 UNION ALL
18 SELECT 2 event_code, ADD_MONTHS (SYSDATE - 2, -2) event_date,
19 133 value1, -4 value2, 5 value3
20 FROM DUAL
21 UNION ALL
22 SELECT 2 event_code, ADD_MONTHS (SYSDATE - 2, -1) event_date,
23 1454 value1, 1 value2, 4 value3
24 FROM DUAL
25 UNION ALL
26 SELECT 3 event_code, ADD_MONTHS (SYSDATE - 3, -3) event_date,
27 125 value1, 1 value2, 3 value3
28 FROM DUAL
29 UNION ALL
30 SELECT 3 event_code, ADD_MONTHS (SYSDATE - 3, -2) event_date,
31 1888 value1, -1 value2, 2 value3
32 FROM DUAL
33 UNION ALL
34 SELECT 3 event_code, ADD_MONTHS (SYSDATE - 3, -1) event_date,
35 144 value1, 1 value2, 1 value3
36 FROM DUAL)
37 SELECT event_code, event_date, value1, value2, value3,
38 CASE
39 WHEN ( (value1 > value2)
40 AND (event_date BETWEEN TO_DATE ('09/01/2008 00:00:00',
41 'mm/dd/yyyy hh24:mi:ss'
42 )
43 AND TO_DATE ('09/30/2008 23:59:59',
44 'mm/dd/yyyy hh24:mi:ss'
45 )
46 )
47 )
48 THEN 1
49 ELSE 0
50 END bigger,
51 CASE
52 WHEN MAX (event_date) OVER (PARTITION BY event_code)
53 BETWEEN TO_DATE ('09/01/2008 00:00:00',
54 'mm/dd/yyyy hh24:mi:ss'
55 )
56 AND TO_DATE ('09/30/2008 23:59:59',
57 'mm/dd/yyyy hh24:mi:ss'
58 )
59 THEN MAX (event_date) OVER (PARTITION BY event_code)
60 ELSE NULL
61 END last_date,
62 CASE
63 WHEN MAX (event_date) OVER (PARTITION BY event_code)
64 BETWEEN TO_DATE ('09/01/2008 00:00:00',
65 'mm/dd/yyyy hh24:mi:ss'
66 )
67 AND TO_DATE ('09/30/2008 23:59:59',
68 'mm/dd/yyyy hh24:mi:ss'
69 )
70 THEN LAST_VALUE (value3) OVER (PARTITION BY event_code ORDER BY event_date)
71 ELSE NULL
72 END last_value3
73 FROM test_table
74* ORDER BY 1, 2
EVENT_CODE EVENT_DA VALUE1 VALUE2 VALUE3 BIGGER LAST_DAT LAST_VALUE3
1 20/06/08 100 -1 7 0
1 20/07/08 1 1 9 0
1 20/08/08 3 2 8 0
2 19/07/08 122 1 6 0 19/09/08 6
2 19/08/08 133 -4 5 0 19/09/08 5
2 19/09/08 1454 1 4 1 19/09/08 4
3 18/07/08 125 1 3 0 18/09/08 3
3 18/08/08 1888 -1 2 0 18/09/08 2
3 18/09/08 144 1 1 1 18/09/08 1
9 rows selected.But what I want is (I am sorry for my ignorance but I don't unerstand why the "ORDER BY event_date" "breaks" my "PARTITION BY event_code"):
EVENT_CODE EVENT_DA VALUE1 VALUE2 VALUE3 BIGGER LAST_DAT LAST_VALUE3
1 20/06/08 100 -1 7 0
1 20/07/08 1 1 9 0
1 20/08/08 3 2 8 0
2 19/07/08 122 1 6 0 19/09/08 4
2 19/08/08 133 -4 5 0 19/09/08 4
2 19/09/08 1454 1 4 1 19/09/08 4
3 18/07/08 125 1 3 0 18/09/08 1
3 18/08/08 1888 -1 2 0 18/09/08 1
3 18/09/08 144 1 1 1 18/09/08 1Thanks again. -
Problem in discoverer with analytic function created non-additive YTD
I have problem with discoverer desktop which show me wrong ytdact, ytdbgt figure after i rollup/pivoting
on custom folder i did in discoverer admin:
SELECT a.year, a.month, c.deptno, b.glaccount, bgt.mthbgt, bgt.ytdbgt, bgt.fullbgt, bgt.lastyr_fullbgt,
act.mthact, act.ytdact
FROM (
SELECT
a.amount mthbgt,
SUM(a.amount) OVER (PARTITION BY ...) fullbgt,
SUM(a.amount) OVER (PARTITION BY ...) ytdbgt,
LAG(SUM(a.amount),1) OVER (PARTITION BY...) lstyr_fullbgt
FROM gltrans_bgt a, gl_master b, dept c
WHERE a.glaccount=b.glaccount AND a.deptno=c.deptno GROUP BY a.year, a.month, c.deptno, b.glaccount
) bgt
FULL OUTER JOIN
SELECT a.year, a.month, c.deptno, b.glaccount,
a.amount mthact,
SUM(a.amount) OVER (PARTITION BY...) ytdact,
LAG(SUM(a.amount),1) OVER (PARTITION BY...) lstyr_ytdact
FROM gltrans_act a, gl_master b, dept c
WHERE a.glaccount=b.glaccount AND a.deptno=c.deptno
GROUP BY a.year, a.month, c.deptno, b.glaccount
) act
ON
bgt.year=act.year AND
bgt.month=bgt.month AND
bgt.deptno=act.deptno AND
bgt.glaccount=act.glaccount
In discoverer desktop, sometime i would like to remove deptno or month to see the rollup figure. But it seems discoverer tried to sum the ytd to give me wrong figure.
I know that to ask oracle rewrite the query in order to roll up the figure, one may need to create dimension and specify the hierarchy for the related .
Anyway to do on this MV so that oracle can rewrite the query for me automatically?I suspect if your FY runs not from Jan - Dec, then someone has had to come to grips with this before and has created some kind of custom FUNCTION to determine the fiscal year from the date entered. Or maybe a table that populated with the same info.
Nevertheless, if there isn't one, then you'd just change the TRUNC(SYSDATE,'YYYY') logic to your fiscal year with a direct calculation.
ie:
calculation: what_fiscal_year
CASE WHEN to_char(sysdate,'MMM') IN ('JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP') THEN to_char(sysdate,'YY')
WHEN to_char(sysdate,'MMM') IN ('OCT','NOV','DEC') then to_char(sysdate,'YY')-1
ELSE '99' END
Something like that - I haven't tested it so treat as pseudo-code first (ie: the last to_char may need to have a to_char(to_number(to_char instead to substract the 1 but might work - Oracle's good with powerful date functions). It should give you an idea of what I'm referring to.
So once each record has an associated FY either by a calculation such as shown or by a calculation calling your corporate FY function, you just do the same thing as described early (ie: range between FY and FY-1).
Russ -
Problem with analytic function
Hi ,
I have table with fields :
ID ,BUG_ID ,COMMENT_TEXT
sample values are
ID BUG_ID COMMENT_TEXT
1 2 test1
2 3 test1
3 2 test2
4 5 test1
5 5 test2
6 2 test3
and I am using following script to get the output
like :
BUG_ID CMNT_TEXT1 COMNT_TEXT2 CMNT_TEXT3
2 test1 test2 test3
3 test1
5 test1 test2
SQL Script is :
select bug_id,
max(decode(seq_no,1,DBMS_LOB.substr(ctext,4000,1))) as comment_text1,
max(decode(seq_no,2,DBMS_LOB.substr(ctext,4000,1))) as comment_text2,
max(decode(seq_no,3,DBMS_LOB.substr(ctext,4000,1))) as comment_text3,
max(decode(seq_no,4,DBMS_LOB.substr(ctext,4000,1))) as comment_text4,
max(decode(seq_no,5,DBMS_LOB.substr(ctext,4000,1))) as comment_text5
from (
select bug_id,
ctext,
row_number() over
(partition by bug_id order by bug_id) as seq_no
from phpbt_dblearn_comment
group by bug_id
but it is always first values ( eg test1 for bug_id 2 , test1 for bug_id 5 ) are missing if i run this script.
Please could someone tell me What is wrong with this script ?
regards,
KarnaHi Karna,
maybe i don't see the problem but that's what i get from my tests:
ID BUG_ID CTEXT
1 2 test1
2 3 test1
3 2 test2
4 5 test1
5 5 test2
6 2 test3
6 Zeilen ausgewählt.
select bug_id,
max(decode(seq_no,1,DBMS_LOB.substr(ctext,4000,1))) as comment_text1,
max(decode(seq_no,2,DBMS_LOB.substr(ctext,4000,1))) as comment_text2,
max(decode(seq_no,3,DBMS_LOB.substr(ctext,4000,1))) as comment_text3,
max(decode(seq_no,4,DBMS_LOB.substr(ctext,4000,1))) as comment_text4,
max(decode(seq_no,5,DBMS_LOB.substr(ctext,4000,1))) as comment_text5
from (
select bug_id,
ctext,
row_number() over
(partition by bug_id order by id) as seq_no
from test2
group by bug_id;
BUG_ID COMMENT_TEXT1 COMMENT_TEXT2 COMMENT_TEXT3 COMMENT_TEXT4 COMMENT_TEXT5
2 test1 test2 test3
3 test1
5 test1 test2
3 Zeilen ausgewählt.
I thought that's what you're lokking for.
Regards,
Alexander
Maybe you are looking for
-
Is there any way to get my reminders (from the new iPhone app) to sync with something on my laptop (Mail, iCal, some other desktop app)?
-
Trash, Sent mail, and Junk mail folders do not work
I just switched from my entourage email to mac's mail, and I noticed some problems that I cannot seem to figure out. I amm using IMAP based email, and had none of these problems on entourage, but I like the format of mail better, so i hope to get thi
-
CS6/CC - Brushes do not work!
Hi there, I have photoshop 5.5 and it works totally fine with my bosto kingtee tablet. I recently tried downloading the CC trial to test it out and I can click buttons in photoshop with the pen just fine, I can draw with the mouse just fine, but it d
-
How Increase performance of delete operation
Hi, How Increase performance of delete operation. This delete is done on a table which has around millions of records and loaded back every day . The statement is in a procedure and is as follows. #$%%$#$; commit; delete from TVRBC_SITE_ROLLUP_T; com
-
OOP debugging dynamically dispatched VI
I'm using OOP to create a hardware abstraction layer (it's secondary to this question but search for "How to Mitigate Hardware Obsolescence in Next-Generation Test Systems" and look at version 2) and backed myself into a corner. My code stopped at a