Merge no SQL using analytical functions
Hi, the Sql tuning specialists:I have a question about the merger of view inline.
I have a simple vision with the analytical functions inside. When questioning him, he does not index.
VIEW to CREATE or REPLACE ttt
AS
SELECT EmpNo, deptno,
ROW_NUMBER() over (PARTITION BY deptno ORDER BY deptno desc NULLS last) part_seq
EMP AAA
-That will do full table for emp scan
Select * from TT
WHERE empno = 7369
-If I do not view use, I use the query directly, the index is used
SELECT EmpNo, deptno,
ROW_NUMBER() over (PARTITION BY deptno ORDER BY deptno desc NULLS last) part_seq
EMP aaa
WHERE empno = 7369
question is: How can I force the first query to use indexes?
Thank you
MScallion wrote:
What happens if you use the push_pred flag:
Nothing will happen. And it would be a bug if he would.
select * from ttt
WHERE empno=7369
and
SELECT empno,deptno,
row_number() OVER (PARTITION BY deptno ORDER BY deptno desc NULLS last) part_seq
FROM emp aaa
WHERE empno=7369
are two logically different queries. Analytical functions are applied after + * resultset is common. So first select query all rows in the emp table then assign ROW_NUMBER() to recovered lines and only then select a line with empno = 7369 her. Second query will select the table emp with empno = 7369 line and only then apply ROW_NUMBER() - so since emp.empno is unique ROW_NUMBER returned by second query will always be equal to 1:
SQL> select * from ttt
2 WHERE empno=7369
3 /
EMPNO DEPTNO PART_SEQ
---------- ---------- ----------
7369 20 4
SQL> SELECT empno,deptno,
2 row_number() OVER (PARTITION BY deptno ORDER BY deptno desc NULLS last) part_seq
3 FROM emp aaa
4 WHERE empno=7369
5 /
EMPNO DEPTNO PART_SEQ
---------- ---------- ----------
7369 20 1
SQL>
SY.
Tags: Database
Similar Questions
-
Cannot use analytical functions such as lag/lead in odi components 12 c except in the expression
Hi I am a beginner of ODI 12 c
I'm trying to get the last two comments made on the product for a given product id. and load them into a target.
I have a source table something like
Product SR_NO comments LAST_UPDATED_TS
1 good car 2015/05/15 08:30:25
1 car average 2015/05/15 10:30:25
Jeep 2 super 2015/05/15 11:30:25
1 car bad 2015/05/15 11:30:25
Jeep 2 horrible 2015/05/15 09:30:25
Jeep 2 excellent 2015/05/15 12:30:25
I want a target table based on their last timestamp updated as (last two comments)
SR_NO Comment1 Comment2
1 bad average
2 super excellent
I used the logic below to get records in SQL Developer but in ODI 12 c, I'm not able to do this by mapping a source to the target table by applying analytical functions to the columns in the target table. Can someone help me solve this problem
SELECT * FROM)
SELECT SR_NO Comment1, LAG(Comment1,1,) ON Comment2 (SR_NO ORDER BY LAST_UPDATED_TS ASC PARTITION),
ROW_NUMBER() ON RN (SCORE FROM SR_NO ORDER BY LAST_UPDATED_TS DESC)
FROM Source_table
) M
WHERE RN = 1
;
UM, I'm afraid that ODI puts the filter too early in the request, if it generates:
SELECT * FROM)
SELECT SR_NO Comment1, LAG(Comment1,1,) ON Comment2 (SR_NO ORDER BY LAST_UPDATED_TS ASC PARTITION),
ROW_NUMBER() ON RN (SCORE FROM SR_NO ORDER BY LAST_UPDATED_TS DESC)
FROM Source_table
WHERE RN = 1
) M
;
Instead of:
SELECT * FROM)
SELECT SR_NO Comment1, LAG(Comment1,1,) ON Comment2 (SR_NO ORDER BY LAST_UPDATED_TS ASC PARTITION),
ROW_NUMBER() ON RN (SCORE FROM SR_NO ORDER BY LAST_UPDATED_TS DESC)
FROM Source_table
) M
WHERE RN = 1
;
Even by changing the 'run on Hint"of your component of the expression to get there on the source, the request will stay the same.
I think the easiest solution for you is to put everything before the filter in a reusable mapping with a signature of output. Then drag this reusable in your mapping as the new source and check the box "subselect enabled."
Your final mapping should look like this:
It will be useful.
Kind regards
JeromeFr
-
date ranges - possible to use analytical functions?
The following datastructure must be converted into a daterange datastructure.
Working solution:START_DATE END_DATE AMMOUNT ---------- ---------- ---------- 01-01-2010 28-02-2010 10 01-02-2010 31-03-2010 20 01-03-2010 31-05-2010 30 01-09-2010 31-12-2010 40
Output:with date_ranges as ( select to_date('01-01-2010','dd-mm-yyyy') start_date , to_date('28-02-2010','dd-mm-yyyy') end_date , 10 ammount from dual union all select to_date('01-02-2010','dd-mm-yyyy') start_date , to_date('31-03-2010','dd-mm-yyyy') end_date , 20 ammount from dual union all select to_date('01-03-2010','dd-mm-yyyy') start_date , to_date('31-05-2010','dd-mm-yyyy') end_date , 30 ammount from dual union all select to_date('01-09-2010','dd-mm-yyyy') start_date , to_date('31-12-2010','dd-mm-yyyy') end_date , 40 ammount from dual ) select rne.start_date , lead (rne.start_date-1,1) over (order by rne.start_date) end_date , ( select sum(dre2.ammount) from date_ranges dre2 where rne.start_date >= dre2.start_date and rne.start_date <= dre2.end_date ) range_ammount from ( select dre.start_date from date_ranges dre union -- implicit distinct select dre.end_date + 1 from date_ranges dre ) rne order by rne.start_date /
However, I would like to use an analytical function to calculate the range_ammount. Is this possible?START_DATE END_DATE RANGE_AMMOUNT ---------- ---------- ------------- 01-01-2010 31-01-2010 10 01-02-2010 28-02-2010 30 01-03-2010 31-03-2010 50 01-04-2010 31-05-2010 30 01-06-2010 31-08-2010 01-09-2010 31-12-2010 40 01-01-2011 7 rows selected.
Published by: user5909557 on July 29, 2010 06:19Hello
Welcome to the forum!
Yes, you can replace the scalar sub-queriy with a SUMMARY, like this:
WITH change_data AS ( SELECT start_date AS change_date , ammount AS net_amount FROM date_ranges -- UNION -- SELECT end_date + 1 AS change_date , -ammount AS net_amount FROM date_ranges ) , got_range_amount AS ( SELECT change_date AS start_date , LEAD (change_date) OVER (ORDER BY change_date) - 1 AS end_date , SUM (net_amount) OVER (ORDER BY change_date) AS range_amount FROM change_data ) , got_grp AS ( SELECT start_date , end_date , range_amount , ROW_NUMBER () OVER ( ORDER BY start_date, end_date) - ROW_NUMBER () OVER ( PARTITION BY range_amount ORDER BY start_date, end_date ) AS grp FROM got_range_amount ) SELECT MIN (start_date) AS start_date , MAX (end_date) AS end_date , range_amount FROM got_grp GROUP BY grp , range_amount ORDER BY grp ;
This should be much more effective.
The code is longer than what you posted. It is largely because it includes consecutive groups with the same amount.
For example, if you add this line the sample data:-- union all select to_date('02-01-2010','dd-mm-yyyy') start_date , to_date('30-12-2010','dd-mm-yyyy') end_date , 0 ammount from dual
The query that you posted the product:
START_DAT END_DATE RANGE_AMMOUNT --------- --------- ------------- 01-JAN-10 01-JAN-10 10 02-JAN-10 31-JAN-10 10 01-FEB-10 28-FEB-10 30 01-MAR-10 31-MAR-10 50 01-APR-10 31-MAY-10 30 01-JUN-10 31-AUG-10 0 01-SEP-10 30-DEC-10 40 31-DEC-10 31-DEC-10 40 01-JAN-11
I suppose you want only a new production line where the changes of range_amount., it is:
START_DAT END_DATE RANGE_AMOUNT --------- --------- ------------ 01-JAN-10 31-JAN-10 10 01-FEB-10 28-FEB-10 30 01-MAR-10 31-MAR-10 50 01-APR-10 31-MAY-10 30 01-JUN-10 31-AUG-10 0 01-SEP-10 31-DEC-10 40 01-JAN-11 0
Of course, you can change the original query so that it did, but it would eventually just as complex as the above query, but less effective.
Conversely, if you prefer the longer output, then you need not got_grp Tahina-query in the above query.Thanks for posting the CREATE TABLE and INSERT statements; It is very useful.
There are people who use this forum for years and have yet to be begged to do. -
Need help to resolve the query by using analytic functions
Hello
I need help to solve this problem, I tried an analytical function but could not solve the problem.
I have three table as illustrated below the table is filled with a flat file. The records are arranged sequentailly based on the name of the file.
The first record of the game based on EIN goes to TAB_RCE
the following records then goes to TAB_RCW
and last save of the game based on EIN goes to the RCT table
How can I make groups and
assign a
EIN * 12345 * line number * 02, 03, 04 * in the table TAB_RCW and * 05 * in the table TAB_RCT
EIN * 67890 * line number * 07, 08, 09,10 * in the table TAB_RCW and * 11 * in the table TAB_RCT
and so on...
Thank you
Rajesh
TAB RCE_--------------------------------------------------------------
LineNumber EIN FILENAME TYPE
-----
01 12345 ABC NCE. TXT
06 67890 ABC NCE. TXT
12 76777 ABC NCE. TXT
-----
TAB_RCW
-----
LineNumber TYPE SSN FILENAME
-----
02 22222 ABC RCW. TXT
03 33333 ABC RCW. TXT
04 44444 ABC RCW. TXT
07 55555 ABC RCW. TXT
08 66666 ABC RCW. TXT
09 77777 ABC RCW. TXT
10 88888 ABC RCW. TXT
13 99998 ABC RCW. TXT
14 99999 ABC RCW. TXT
-----
TAB_RCT
-----
NAME OF THE FILE OF TYPE LINENUMBER
-----
RCT 05 ABC. TXT
RCT 11 ABC. TXT
RCT 15 ABC. TXT
-----SQL> with TAB_RCE as ( 2 select 'RCE' rtype,'01' linenumber, '12345' EIN,'ABC.TXT' FILENAME from dual union all 3 select 'RCE','06','67890','ABC.TXT' from dual union all 4 select 'RCE','12','76777','ABC.TXT' from dual 5 ), 6 TAB_RCW as ( 7 select 'RCW' rtype,'02' linenumber,'22222' ssn,'ABC.TXT' FILENAME from dual union all 8 select 'RCW','03','33333','ABC.TXT' from dual union all 9 select 'RCW','04','44444','ABC.TXT' from dual union all 10 select 'RCW','07','55555','ABC.TXT' from dual union all 11 select 'RCW','08','66666','ABC.TXT' from dual union all 12 select 'RCW','09','77777','ABC.TXT' from dual union all 13 select 'RCW','10','88888','ABC.TXT' from dual union all 14 select 'RCW','13','99998','ABC.TXT' from dual union all 15 select 'RCW','14','99999','ABC.TXT' from dual 16 ), 17 TAB_RCT as ( 18 select 'RCT' rtype,'05' linenumber,'ABC.TXT' FILENAME from dual union all 19 select 'RCT','11','ABC.TXT' from dual union all 20 select 'RCT','15','ABC.TXT' from dual 21 ) 22 select rtype, 23 last_value(ein ignore nulls) over(partition by filename order by linenumber) ein, 24 linenumber, 25 ssn 26 from ( 27 select rtype, 28 linenumber, 29 ein, 30 to_char(null) ssn, 31 filename 32 from TAB_RCE 33 union all 34 select rtype, 35 linenumber, 36 to_char(null) ein, 37 ssn, 38 filename 39 from TAB_RCW 40 union all 41 select rtype, 42 linenumber, 43 to_char(null) ein, 44 to_char(null) ssn, 45 filename 46 from TAB_RCt 47 ) 48 order by linenumber 49 / RTY EIN LI SSN --- ----- -- ----- RCE 12345 01 RCW 12345 02 22222 RCW 12345 03 33333 RCW 12345 04 44444 RCT 12345 05 RCE 67890 06 RCW 67890 07 55555 RCW 67890 08 66666 RCW 67890 09 77777 RCW 67890 10 88888 RCT 67890 11 RTY EIN LI SSN --- ----- -- ----- RCE 76777 12 RCW 76777 13 99998 RCW 76777 14 99999 RCT 76777 15 15 rows selected. SQL>
SY.
-
the date of consolidation extends using analytic functions
I am trying to establish how long a person was in a situation the data looks like this
person Locator recorded_date
--------------------------------------------------------
01/01/2012 10:10 LOC_A PERSON_X
03/01/2012 PERSON_X LOC_A 15:10
04/01/2012 PERSON_X LOC_B 02:00
05/01/2012 PERSON_X LOC_B 11:10
06/01/2012 PERSON_X LOC_A 03:10
What I want in the output. I want to divide it into 3 bays. What do I get with min and rank is a grouping of the last loc_a with the first that goes on the average time they were in a different location.
Start anyone to date date stop
-----------------------------------------------------------------------------------
01/01/2012 10:10 01/04/2012 PERSON_X LOC_A 02:00
04/01/2012 02:00 06/01/2012 PERSON_X LOC_B 03:10
06/01/2012 PERSON_X LOC_A 03:10Hello
DanU says:
Thanks Frank! This was extremely helpful. I probably get the final stages. The only piece I am missing is having the end defined by the following date recorded date. So I might try your query with the lead function.Sorry, I don't have the sense of end_date.
You're right; all you need is the analytical function of LEAD to get:WITH got_grp AS ( SELECT recorded_date, cqm_category, pat_acct_num , ROW_NUMBER () OVER ( PARTITION BY pat_acct_num ORDER BY recorded_date ) - ROW_NUMBER () OVER ( PARTITION BY pat_acct_num , cqm_category ORDER BY recorded_date ) AS grp FROM export_table ) SELECT MIN (recorded_date) AS start_date , LEAD (MIN (recorded_date)) OVER ( PARTITION BY pat_acct_num ORDER BY MIN (recorded_date) ) AS stop_date , cqm_category , pat_acct_num FROM got_grp GROUP BY pat_acct_num, cqm_category, grp ORDER BY pat_acct_num, start_date ;
It's almost the same query as what I posted before.
Apart from substituting your new table and column names, the only change I made was how stop_date is defined in the main query. -
How to prioritize the query result using analytic functions
Hello
Published by: prakash on May 20, 2013 01:42Use ROW_NUMBER
SQL> select PRVDR_LCTN_X_SPCLTY_SID,PRVDR_LCTN_IID,PRVDR_TYPE_X_SPCLTY_SID,STATUS_CID 2 from 3 ( 4 select t.*, 5 row_number() over(partition by PRVDR_TYPE_X_SPCLTY_SID 6 order by STATUS_CID) rn 7 from your_table t 8 ) 9 where rn = 1; PRVDR_LCTN_X_SPCLTY_SID PRVDR_LCTN_IID PRVDR_TYPE_X_SPCLTY_SID STATUS_CID ----------------------- -------------- ----------------------- ---------- 75292110 10153920 75004770 1 75291888 10153920 75004884 2 75292112 10153920 75004916 1 75292117 10153920 75004974 1
-
by using the analytical function to get the right output.
Hello all;
I have the following date of sample below
It's the output I wantcreate table temp_one ( id number(30), placeid varchar2(400), issuedate date, person varchar2(400), failures number(30), primary key(id) ); insert into temp_one values (1, 'NY', to_date('03/04/2011', 'MM/DD/YYYY'), 'John', 3); insert into temp_one values (2, 'NY', to_date('03/03/2011', 'MM/DD/YYYY'), 'Adam', 7); insert into temp_one values (3, 'Mexico', to_date('03/04/2011', 'MM/DD/YYYY'), 'Wendy', 3); insert into temp_one values (4, 'Mexico', to_date('03/14/2011', 'MM/DD/YYYY'), 'Gerry', 3); insert into temp_one values (5, 'Mexico', to_date('03/15/2011', 'MM/DD/YYYY'), 'Zick', 9); insert into temp_one values (6, 'London', to_date('03/16/2011', 'MM/DD/YYYY'), 'Mike', 8);
Any help is appreciated. I'll post my request as soon as I can think of a good logic for this...placeid issueperiod failures NY 02/28/2011 - 03/06/2011 10 Mexico 02/28/2011 - 03/06/2011 3 Mexico 03/14/2011 - 03/20/2011 12 London 03/14/2011 - 03/20/2011 8
Hello
user13328581 wrote:
... Please note, I'm still learning how to use analytical functions.It doesn't matter; analytical functions will not help in this problem. The SUM aggregate function is all you need.
But what do you need to GROUP BY? What is the value of each row of the result will represent? A placeid? Yes, each line will represent only placedid, but it will be divided further. You want a separate line of the output for each placeid and every week, then you'll want of the week and GROUP BY placeid. You don't want to GROUP BY the raw issuedate; that would put on 3 March and 4 March in separate groups. And you don't want to GROUP BY failures; This would mean that a line with 3 failures could never be in the same group in line with 9 failures.This becomes the output you posted from the sample data you posted:
SELECT placeid , TO_CHAR ( TRUNC (issuedate, 'IW') , 'MM/DD/YYYY' ) || ' - '|| TO_CHAR ( TRUNC (issuedate, 'IW') + 6 , 'MM/DD/YYY' ) AS issueperiod , SUM (failures) AS sumfailures FROM temp_one GROUP BY placeid , TRUNC (issuedate, 'IW') ;
You can use a subquery to calculate TRUNC (issuedate, 'IW') once. The code would be of about as complicated, efficiency probably will not improve substantially and the results would be the same.
-
Hello
I have a problem using the analytical function: when I run this query
SELECT TSIUPSITE, TSIUPCEAN, TSIUPDATE, sum (TSIUPCA) TSIUPCA, TSIUPCTVA, TSIUPP4N, TSIUPPIEC,.
Sum (TSIUPQTE) TSIUPQTE, sum (TSIUPQTEP) TSIUPQTEP, TSIUPMDIU, TSIUPMDar,
Sum (TSIUPCRIU) TSIUPCRIU, sum (TSIUPCRAR) TSIUPCRAR, trunc (TSIUPDCRE) TSIUPDCRE, trunc (TSIUPDMAJ) TSIUPDMAJ,
TSIUPUTIL, TSIUPTRT, TSIUPNERR, TSIUPMESS.
TSIUPTMVT, TSIUPSMAN, TSIUPMOTIF, sum (TSIUPMHT) TSIUPMHT, 0 vtanfisc.
TSIUPDATEVERIF, TSIUPNSEQ, TSIUPCINV, count (*) over (partition TSIUPSITE, TSIUPCEAN, TSIUP_TRT) CONTA_ARTICOLO
OF TST_FLIISR_VTEREMART
WHERE 1 = 1 - TSIUP_TRT = 1
AND TSIUPDATE = to_date('27082012','ddmmyyyy')
and TSIUP_NTRX = 172
AND TSIUPSITE = 10025
AND TSIUPCEAN = '8012452018825'
GROUP OF TSIUPSITE, TSIUPCEAN, TSIUPDATE, TSIUPCTVA, TSIUPP4N, TSIUPPIEC,
TSIUPMDIU, TSIUPMDar, trunc (TSIUPDCRE), trunc (TSIUPDMAJ), TSIUPUTIL, TSIUPTRT, TSIUPNERR, TSIUPMESS,
TSIUPTMVT, TSIUPSMAN, TSIUPMOTIF, 0,
TSIUPDATEVERIF, TSIUPNSEQ, TSIUPCINV
ORDER OF TSIUPSITE, TSIUPDATE;
I have the error ORA-00979: not an expression GROUP BY related to the area of TSIUP_TRT, infact, if I run it
SELECT TSIUPSITE, TSIUPCEAN, TSIUPDATE, sum (TSIUPCA) TSIUPCA, TSIUPCTVA, TSIUPP4N, TSIUPPIEC,.
Sum (TSIUPQTE) TSIUPQTE, sum (TSIUPQTEP) TSIUPQTEP, TSIUPMDIU, TSIUPMDar,
Sum (TSIUPCRIU) TSIUPCRIU, sum (TSIUPCRAR) TSIUPCRAR, trunc (TSIUPDCRE) TSIUPDCRE, trunc (TSIUPDMAJ) TSIUPDMAJ,
TSIUPUTIL, TSIUPTRT, TSIUPNERR, TSIUPMESS.
TSIUPTMVT, TSIUPSMAN, TSIUPMOTIF, sum (TSIUPMHT) TSIUPMHT, 0 vtanfisc.
TSIUPDATEVERIF, TSIUPNSEQ, TSIUPCINV, count (*) over (partition TSIUPSITE, TSIUPCEAN) CONTA_ARTICOLO
OF TST_FLIISR_VTEREMART
WHERE 1 = 1 - TSIUP_TRT = 1
AND TSIUPDATE = to_date('27082012','ddmmyyyy')
and TSIUP_NTRX = 172
AND TSIUPSITE = 10025
AND TSIUPCEAN = '8012452018825'
GROUP OF TSIUPSITE, TSIUPCEAN, TSIUPDATE, TSIUPCTVA, TSIUPP4N, TSIUPPIEC,
TSIUPMDIU, TSIUPMDar, trunc (TSIUPDCRE), trunc (TSIUPDMAJ), TSIUPUTIL, TSIUPTRT, TSIUPNERR, TSIUPMESS,
TSIUPTMVT, TSIUPSMAN, TSIUPMOTIF, 0,
TSIUPDATEVERIF, TSIUPNSEQ, TSIUPCINV
ORDER OF TSIUPSITE, TSIUPDATE;
I have no problem. Now the difference between the TSIUPCEAN (or TSIUPSITE) and TSIUP_TRT that TSIUP_TRT is not in the Group By clause, but, to be honest, I don't know why I have this problem using using an analytic function.
Thanks for helpHello
I think that you are not analytic function correctly.
Analytical functions will be run for each line. Where as Group BY will run for groups of data.
See example below for you reference.
Example 1: -- Below query displays number of employees for each department. Since we have used analytical function for each row you are getting the number of employees based on the department id. SQL> SELECT e.department_id,count(*) OVER (PARTITION BY e.department_id) cnt_analytic 2 FROM employees e 3 WHERE e.department_id IN (10,20,30); DEPARTMENT_ID CNT_ANALYTIC ------------- ------------ 10 1 20 2 20 2 30 6 30 6 30 6 30 6 30 6 30 6 9 rows selected. Example 2: -- Since I have used GROUP BY clause I'm getting only single row for each department. SQL> SELECT e.department_id, count(*) cnt_group 2 FROM employees e 3 WHERE e.department_id IN (10,20,30) 4 GROUP BY e.department_id; DEPARTMENT_ID CNT_GROUP ------------- ---------- 10 1 20 2 30 6
Finally, what I'm trying to explain is - if you use the analytical function with the GROUP BY clause, the query will not give the ful menaing result set.
See below
SQL> SELECT e.department_id,count(*) OVER (PARTITION BY e.department_id) cnt_analytic, count(*) cnt_grp 2 FROM employees e 3 WHERE e.department_id IN (10,20,30) 4 GROUP BY e.department_id; DEPARTMENT_ID CNT_ANALYTIC CNT_GRP ------------- ------------ ---------- 10 1 1 20 1 2 30 1 6
-
Problem with analytical function for date
Hi all
ORCL worm:
Oracle Database 11 g Enterprise Edition Release 11.2.0.2.0 - 64 bit Production
PL/SQL Release 11.2.0.2.0 - Production
"CORE 11.2.0.2.0 Production."
AMT for Linux: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production
I have a problem with the analtical for the date function. I'm trying to group records based on timestamp, but I'm failing to do.
Could you please help me find where I'm missing.
THXThis is the subquery. No issue with this. I'm just posting it for reference. select sum(disclosed_cost_allocation.to_be_paid_amt) amt, substr(reference_data.ref_code,4,10) cd, to_char(external_order_status.status_updated_tmstp, 'DD-MON-YYYY HH24:MI:SS') tmstp, DISCLOSED_CLOSING_COST.DISCLOSED_CLOSING_COST_ID id FROM Deal.Fee_Mapping_Definition , Deal.Fee_Index_Definition , Deal.Fee_Closing_Cost_Item, Deal.Closing_Cost, Deal.Document_Generation_Request, deal.PRODUCT_REQUEST, deal.External_Order_Request, deal.External_Order_Status, deal. DISCLOSED_CLOSING_COST, deal.DISCLOSED_COST_ALLOCATION, deal.reference_data WHERE Fee_Mapping_Definition.Fee_Code = Fee_Index_Definition.Fee_Code AND Fee_Index_Definition.Fee_Index_Definition_Id = Fee_Closing_Cost_Item.Fee_Index_Definition_Id AND Fee_Closing_Cost_Item.Closing_Cost_Id = Closing_Cost.Closing_Cost_Id AND CLOSING_COST.PRODUCT_REQUEST_ID = Document_Generation_Request.Product_Request_Id AND closing_cost.product_request_id = product_request.product_request_id AND Product_Request.Deal_Id = External_Order_Request.Deal_Id AND external_order_request.external_order_request_id = external_order_status.external_order_request_id AND external_order_request.external_order_request_id = disclosed_closing_cost.external_order_request_id AND DISCLOSED_CLOSING_COST. DISCLOSED_CLOSING_COST_ID = DISCLOSED_COST_ALLOCATION.DISCLOSED_CLOSING_COST_ID AND Fee_Index_Definition.Fee_Index_Definition_Id = Disclosed_Closing_Cost.Fee_Index_Definition_Id AND Fee_Mapping_Definition.Document_Line_Series_Ref_Id = Reference_Data.Reference_Data_Id AND Document_Generation_Request.Document_Package_Ref_Id IN (7392 ,2209 ) AND External_Order_Status.Order_Status_Txt = ('GenerationCompleted') AND Fee_Mapping_Definition.Document_Line_Series_Ref_Id IN ( 7789, 7788,7596 ) AND FEE_MAPPING_DEFINITION.DOCUMENT_TYPE_REF_ID = 1099 AND Document_Generation_Request.Product_Request_Id IN (SELECT PRODUCT_REQUEST.PRODUCT_REQUEST_id FROM Deal.Disclosed_Cost_Allocation, Deal.Disclosed_Closing_Cost, DEAL.External_Order_Request, DEAL.PRODUCT_REQUEST, Deal.Scenario WHERE Disclosed_Cost_Allocation.Disclosed_Closing_Cost_Id = Disclosed_Closing_Cost.Disclosed_Closing_Cost_Id AND Disclosed_Closing_Cost.External_Order_Request_Id = External_Order_Request.External_Order_Request_Id AND External_Order_Request.Deal_Id = Product_Request.Deal_Id AND product_request.scenario_id = scenario.scenario_id AND SCENARIO.SCENARIO_STATUS_TYPE_REF_ID = 7206 AND product_request.servicing_loan_acct_num IS NOT NULL AND product_request.servicing_loan_acct_num = 0017498379 --AND Disclosed_Cost_Allocation.Disclosed_Cost_Allocation_Id = 5095263 ) GROUP BY DISCLOSED_CLOSING_COST.DISCLOSED_CLOSING_COST_ID, External_Order_Status.Status_Updated_Tmstp, Reference_Data.Ref_Code, disclosed_cost_allocation.to_be_paid_amt order by 3 desc, 1 DESC; Result: 2000 1304-1399 28-JUL-2012 19:49:47 6880959 312 1302 28-JUL-2012 19:49:47 6880958 76 1303 28-JUL-2012 19:49:47 6880957 2000 1304-1399 28-JUL-2012 18:02:16 6880539 312 1302 28-JUL-2012 18:02:16 6880538 76 1303 28-JUL-2012 18:02:16 6880537 But, when I try to group the timestamp using analytical function, select amt ,cd ,rank() over(partition by tmstp order by tmstp desc) rn from (select sum(disclosed_cost_allocation.to_be_paid_amt) amt, substr(reference_data.ref_code,4,10) cd, to_char(external_order_status.status_updated_tmstp, 'DD-MON-YYYY HH24:MI:SS') tmstp, DISCLOSED_CLOSING_COST.DISCLOSED_CLOSING_COST_ID id FROM Deal.Fee_Mapping_Definition , Deal.Fee_Index_Definition , Deal.Fee_Closing_Cost_Item, Deal.Closing_Cost, Deal.Document_Generation_Request, deal.PRODUCT_REQUEST, deal.External_Order_Request, deal.External_Order_Status, deal. DISCLOSED_CLOSING_COST, deal.DISCLOSED_COST_ALLOCATION, deal.reference_data WHERE Fee_Mapping_Definition.Fee_Code = Fee_Index_Definition.Fee_Code AND Fee_Index_Definition.Fee_Index_Definition_Id = Fee_Closing_Cost_Item.Fee_Index_Definition_Id AND Fee_Closing_Cost_Item.Closing_Cost_Id = Closing_Cost.Closing_Cost_Id AND CLOSING_COST.PRODUCT_REQUEST_ID = Document_Generation_Request.Product_Request_Id AND closing_cost.product_request_id = product_request.product_request_id AND Product_Request.Deal_Id = External_Order_Request.Deal_Id AND external_order_request.external_order_request_id = external_order_status.external_order_request_id AND external_order_request.external_order_request_id = disclosed_closing_cost.external_order_request_id AND DISCLOSED_CLOSING_COST. DISCLOSED_CLOSING_COST_ID = DISCLOSED_COST_ALLOCATION.DISCLOSED_CLOSING_COST_ID AND Fee_Index_Definition.Fee_Index_Definition_Id = Disclosed_Closing_Cost.Fee_Index_Definition_Id AND Fee_Mapping_Definition.Document_Line_Series_Ref_Id = Reference_Data.Reference_Data_Id AND Document_Generation_Request.Document_Package_Ref_Id IN (7392 ,2209 ) AND External_Order_Status.Order_Status_Txt = ('GenerationCompleted') AND Fee_Mapping_Definition.Document_Line_Series_Ref_Id IN ( 7789, 7788,7596 ) AND FEE_MAPPING_DEFINITION.DOCUMENT_TYPE_REF_ID = 1099 AND Document_Generation_Request.Product_Request_Id IN (SELECT PRODUCT_REQUEST.PRODUCT_REQUEST_id FROM Deal.Disclosed_Cost_Allocation, Deal.Disclosed_Closing_Cost, DEAL.External_Order_Request, DEAL.PRODUCT_REQUEST, Deal.Scenario WHERE Disclosed_Cost_Allocation.Disclosed_Closing_Cost_Id = Disclosed_Closing_Cost.Disclosed_Closing_Cost_Id AND Disclosed_Closing_Cost.External_Order_Request_Id = External_Order_Request.External_Order_Request_Id AND External_Order_Request.Deal_Id = Product_Request.Deal_Id AND product_request.scenario_id = scenario.scenario_id AND SCENARIO.SCENARIO_STATUS_TYPE_REF_ID = 7206 AND product_request.servicing_loan_acct_num IS NOT NULL AND product_request.servicing_loan_acct_num = 0017498379 --AND Disclosed_Cost_Allocation.Disclosed_Cost_Allocation_Id = 5095263 ) GROUP BY DISCLOSED_CLOSING_COST.DISCLOSED_CLOSING_COST_ID, External_Order_Status.Status_Updated_Tmstp, Reference_Data.Ref_Code, disclosed_cost_allocation.to_be_paid_amt order by 3 desc, 1 DESC); Result: 312 1302 1 2000 1304-1399 1 76 1303 1 312 1302 1 2000 1304-1399 1 76 1303 1 Required output: 312 1302 1 2000 1304-1399 1 76 1303 1 312 1302 2 2000 1304-1399 2 76 1303 2
Rod.Hey, Rod,
My guess is that you want:
, dense_rank () over (order by tmstp desc) AS rn
RANK means you'll jump numbers when there is a link. For example, if all 3 rows have the exact same last tmstp, all 3 rows would be assigned number 1, GRADE would assign 4 to the next line, but DENSE_RANK attributes 2.
"PARTITION x" means that you are looking for a separate series of numbers (starting with 1) for each value of x. If you want just a series of numbers for the entire result set, then do not use a PARTITION BY clause at all. (PARTITION BY is never required.)
Maybe you want to PARTITIONNER IN cd. I can't do it without some examples of data, as well as an explanation of why you want the results of these data.
You certainly don't want to PARTITION you BY the same expression ORDER BY; It simply means that all the lines are tied for #1.I hope that answers your question.
If not, post a small example data (CREATE TABLE and only relevant columns, INSERT statements) for all of the tables involved and also publish outcomes from these data.
Explain, using specific examples, how you get these results from these data.
Simplify the problem as much as possible.
Always tell what version of Oracle you are using.
See the FAQ forum {message identifier: = 9360002}Published by: Frank Kulash, August 1, 2012 13:20
-
Help me on the analytic function
Hello
I use oracle version
I have a following tablesSQL> select * From v$version; BANNER ---------------------------------------------------------------- Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production PL/SQL Release 9.2.0.8.0 - Production CORE 9.2.0.8.0 Production TNS for Solaris: Version 9.2.0.8.0 - Production NLSRTL Version 9.2.0.8.0 - Production
I use following the QUERY for results. Is it possible to get these same results using ANALYTICAL functionsCREATE TABLE emp_info(emp_id number,ename varchar2(10),chk_date date); CREATE TABLE emp_month(emp_id number,emp_month_date date,chk_amt number(10,2)); insert into emp_info VALUES (101,'PAUL',to_date('01-MAR-2009','DD-MON-YYYY')); insert into emp_info VALUES (102,'JOHN',to_date('01-APR-2009','DD-MON-YYYY')); insert into emp_info VALUES (103,'KRIS',to_date('01-MAY-2009','DD-MON-YYYY')); insert into emp_month values (101,'01-DEC-2008',1432); insert into emp_month values (101,'01-JAN-2009',1412); insert into emp_month values (101,'01-FEB-2009',1632); insert into emp_month values (101,'01-MAR-2009',1672); -- insert into emp_month values (102,'01-DEC-2008',2678); insert into emp_month values (102,'01-JAN-2009',2786); insert into emp_month values (102,'01-FEB-2009',2883); insert into emp_month values (102,'01-MAR-2009',2653); insert into emp_month values (102,'01-APR-2009',2653); -- insert into emp_month values (103,'01-NOV-2008',2343); insert into emp_month values (103,'01-DEC-2008',2311); insert into emp_month values (103,'01-JAN-2009',3122); insert into emp_month values (103,'01-FEB-2009',3412); insert into emp_month values (103,'01-MAR-2009',3312); insert into emp_month values (103,'01-APR-2009',3315); insert into emp_month values (103,'01-MAY-2009',4321);
or I would appreciate any solution better than this.Select e.emp_id,e.ename,e.chk_date,sum(chk_amt) year_amt from emp_month em ,(select emp_id,ename,chk_date from emp_info)e where e.emp_id = em.emp_id and em.emp_month_date between trunc(e.chk_date,'YY') AND e.chk_date group by e.emp_id,e.ename,e.chk_date
user12212962 wrote:
I use following the QUERY for results. Is it possible to get these same results using ANALYTICAL functions
or I would appreciate any solution better than this.
I have no idea why you need analytic function. I know: there is no need to view inline in your query:
SQL> Select e.emp_id,e.ename,e.chk_date,sum(chk_amt) year_amt 2 from emp_month em 3 ,(select emp_id,ename,chk_date 4 from emp_info)e 5 where e.emp_id = em.emp_id 6 and em.emp_month_date between trunc(e.chk_date,'YY') AND e.chk_date 7 group by e.emp_id,e.ename,e.chk_date 8 SQL> / EMP_ID ENAME CHK_DATE YEAR_AMT ---------- ---------- --------- ---------- 102 JOHN 01-APR-09 10975 101 PAUL 01-MAR-09 4716 103 KRIS 01-MAY-09 17482 SQL> Select e.emp_id,e.ename,e.chk_date,sum(chk_amt) year_amt 2 from emp_month em, 3 emp_info e 4 where e.emp_id = em.emp_id 5 and em.emp_month_date between trunc(e.chk_date,'YY') AND e.chk_date 6 group by e.emp_id,e.ename,e.chk_date 7 / EMP_ID ENAME CHK_DATE YEAR_AMT ---------- ---------- --------- ---------- 102 JOHN 01-APR-09 10975 101 PAUL 01-MAR-09 4716 103 KRIS 01-MAY-09 17482 SQL>
SY.
-
Is there a shorter way (better) with analytical functions?
Here's a little test scenario:
For each id, I want to add all the values of m only when they have a different type. It would be a long journey:create table t ( id number, pos number, typ number, m number); insert into t values (1,1,1,100); insert into t values (1,2,1,100); insert into t values (1,3,2, 50); insert into t values (2,1,3, 30); insert into t values (2,2,4, 70); insert into t values (3,1,1,100); insert into t values (3,2,2, 50); insert into t values (4,1,3, 30); insert into t values (4,2,5, 80); insert into t values (4,3,3, 30); insert into t values (5,1,3, 30); insert into t values (5,2,6, 30); insert into t values (6,1,2, 50); insert into t values (6,2,7, 50); insert into t values (6,3,2, 50); insert into t values (7,1,4, 70); insert into t values (7,2,4, 70); insert into t values (7,3,4, 70);
but I wonder, is it possible to get this result with a single statement select using analytic functions, something likewith t1 as (select id, typ, min(m) m1 from t group by id, typ) select id, sum(m1) f from t1 group by id order by 1; ID F ---------- ---------- 1 150 2 100 3 150 4 110 5 60 6 100 7 70
select id, sum(m) over (partition by distinct typ) F -- this does not work. It's only an idea how it might look like from t group by id;
This is firstly a collection with the id, type with calculation of the min for each id, type the combination.
By subsequently for each id of the sum of the minutes (for each combination of id, type for this particular id) is summarized.select distinct id, sum(min(m)) over (partition by id) from data group by id, typ order by id
Published by: chris227 on 15.03.2013 07:39
-
Purpose of the ORDER BY clause in the analytic function Min Max
I was always using analytical functions like Min Max without ORDER BY clause. But today I used with the ORDER BY clause. The results are very different. I would like to know the purpose of the ORDER BY clause in Min, Max and analogues of analytical functions.user10566312 wrote:
I was always using analytical functions like Min Max without ORDER BY clause. But today I used with the ORDER BY clause. The results are very different. I would like to know the purpose of the ORDER BY clause in Min, Max and analogues of analytical functions.It is a good point that many developers are not so aware. As far as I understand it the way it works.
Some analytical functions do not need an order by or windowing clause (SUM, COUNT, MIN, etc.). If there is no specified window, then the full score is the window.
As soon as you add a command also add you a windowing clause. This window has the default value of 'rank ofrowsbetween unbounded preceding and current_row. So as soon as you add an order by clause, you get a sliding window.Documentation: http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions001.htm
windowing_clause
...
You cannot specify this clause unless you specified the order_by_clause. Window limits defined by the clause RANGE you can not specify only a single expression to the > order_by_clause. Please refer to 'Restrictions on the ORDER BY Clause'.example of
with testdata as (select 10 numval, level lv from dual connect by level < 10) select lv, numval, sum(numval) over () sum1, sum(numval) over (order by lv) sum2 from testdata; LV NUMVAL SUM1 SUM2 -- ------ ---- ---- 1 10 90 10 2 10 90 20 3 10 90 30 4 10 90 40 5 10 90 50 6 10 90 60 7 10 90 70 8 10 90 80 9 10 90 90
Published by: Sven w. on 25 Sep 2012 16:57 - default behavior has been corrected. Thanks to Chris
-
May result by analytic function that follows
Hi all
I am currently using oracle 10g.
create table
INSERT statementCREATE TABLE fortest ( PROD VARCHAR2(40 BYTE), prodvalues number);
I need the output as followsinsert into fortest values ('dental',10) insert into fortest values ('dental',4) insert into fortest values ('dental',13) insert into fortest values ('dental',3) insert into fortest values ('vision',2) insert into fortest values ('vision',11) insert into fortest values ('vision',33) insert into fortest values ('vision',7)
first column should give me separate prod, prodvalues5 column: should give me the number of similar prod with prodvalues less than 5, same thirdcolumn should have County of similar prod with prodvalues > = 5 and prodvalue < 10 and so on.prod prodvalues <5 prodvalues >=5 and less than 10 prodvalues >=10 dental 2 0 2 vision 1 1 2
Please, not the names of columns of the output tables are just for reference, and I will not use them.
Thanks in advance.Hi Bob,
You don't have to use analytical functions. Here's a solution that doesn't use analytical functions:
with temp as (select prod, case when prodvalues <=5 then 1 else 0 end as prod5, case when prodvalues >=5 and prodvalues <10 then 1 else 0 end as prod5_10, case when prodvalues >= 10 then 1 else 0 end as prod10 from fortest) select prod,sum(prod5) as prod5 , sum(prod5_10) as prod5_10 ,sum(prod10) as prod10 from temp group by prod
-
With the help of analytical functions
Hi all
I'm using ODI 11 g (11.1.1.3.0) and I'm doing an interface using analytical functions in the column map, something like below.
Salary on (partition of...)
The problem is that when ODI saw the sum he considers this an aggregate function and the group. Is it possible to understand that it is not an aggregate in ODI function?
I tried to create an option to specify whether it is analytic, then updated IKM with no luck.
< % if (odiRef.getUserExit("ANALYTIC").equals("1")) {% >}
< %} else {% >}
< % = odiRef.getGrpBy (i) % >
< % = odiRef.getHaving (i) % >
< %} % >
Thanks in advanceSeth,
Try this thing posted by Uli:
http://www.business-intelligence-quotient.com/?p=905 -
I have a situation where I partitioned a Recordset. If in one partition on this recordset, the value of a field (field name registered) is '45' I need to order the result of this partition by - "outdate" desc "this provision" desc and order the other partition of desc 'key',' sequence ' desc, desc "outdate."
If the query looks like to.
Select row_number() over (partition by the order of the keys in sequence) RowNo, key, seq, status, outdate, receivedate from table1 where...
order by?
RowNo status outdate Seq key provision
1 200 0 24 9/13 / 2009 12/9/2009
2 200 1 23 9/10 / 2009 9/09/2009
3 200 2 24 9/09 / 2009 9/08/2009
1 210 0 24 9/13 / 2009 12/9/2009
2 210 1 * 45 * 9/09/2009-9/08/2009
3 210 2 24 9/10 / 2009 9/09/2009
So I need to get the query that will order the first series of partition by desc 'key',' order ' desc, desc "outdate" and the second set of partition (because the status of '45' exists in the second partition) by "outdate" desc "this provision" desc.
The output of the query should look like
RowNo status outdate Seq key provision
1 200 0 24 9/13 / 2009 12/9/2009
2 200 1 23 9/10 / 2009 9/09/2009
3 200 2 24 9/09 / 2009 9/08/2009
1 210 0 24 9/13 / 2009 12/9/2009
2 210 2 24 9/10 / 2009 9/09/2009
3 210 1 * 45 * 9/09/2009-9/08/2009
I don't know if this is possible using the analytical function.
I would appreciate if any can help me with that.
Thanks in advanceHello
Welcome to the forum!
You can use analytical functions in the ORDER BY clause.
I do not have your tables, so I'll use scott.emp to illustrate.
The following query sorts first by deptno. After this, the sort order for the departments that contain at least one seller is:
b job
(b) ename
DEPTNO = 30 is be the only Department with a seller, so it's the only sorting as shown above.
Other departments will be sorted by
(a) sal
(b) jobSELECT deptno , ename , job , sal FROM scott.emp ORDER BY deptno , CASE WHEN COUNT ( CASE WHEN job = 'SALESMAN' THEN 1 END ) OVER (PARTITION BY deptno) > 0 THEN ROW_NUMBER () OVER ( PARTITION BY deptno ORDER BY job , ename ) ELSE ROW_NUMBER () OVER ( PARTITION BY deptno ORDER BY sal , job ) END ;
Output:
. DEPTNO ENAME JOB SAL ---------- ---------- --------- ---------- 10 MILLER CLERK 1300 10 CLARK MANAGER 2450 10 KING PRESIDENT 5000 20 SMITH CLERK 800 20 ADAMS CLERK 1100 20 JONES MANAGER 2975 20 SCOTT ANALYST 3000 20 FORD ANALYST 3000 30 JAMES CLERK 950 30 BLAKE MANAGER 2850 30 ALLEN SALESMAN 1600 30 MARTIN SALESMAN 1250 30 TURNER SALESMAN 1500 30 WARD SALESMAN 1250
The small set of sample data you posted, the results you want can be achieved simply through
ORDER BY key , outdate DESC
I guess it's just a coincidence.
If you need help, post some examples of data that requires really looking at the status column to get good results. Display the data in executable form, such as CREATE TABLE and the instructions INSERT, olr, as Salim, a WITH clause. (Maybe you can simply add or change a couple of lines in the example Salim already posted data).
Maybe you are looking for
-
When you use the address bar to search Firefox automatically chooses the Web site he thinks is the best and opens the page. How can I stop this from happening?
-
Beta software will void the warranty?
I'm curious to know if the beta like iOS 9.3.2 Beta 3 software could cause warranty cancellation since I want to use a large number of features, even on a personal phone.
-
No web address space or the buttons (Tools, view, back, etc.)
Removing a toolbar, I accidentally downloaded during the installation of software, I lost the space for entering web addresses and also all the buttons - file, view, tools, etc.. Help. This has happened Each time Firefox opened == I deleted the toolb
-
Satellite Pro L850: ATI Catalyst was able to start after the update of Windows
Satellite Pro L850 with Windows 8 Pro 64 bit running OK with default Toshiba Catalyst Control Center and the 8.982.10.6000 video driver version. Video chipset is AMD Radeon HD7670M. This week, Windows Update offered an update of WDDM1.2 for HD7670M v
-
Need the number of the part for the blu - ray, DVD burner. Also of rather than one for sale if possible. Thank you!