Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

finding the min date of different dataset and pivoting

DevxMar 7 2020 — edited Mar 7 2020

Hi everyone,

i have a scenario where i want to find the min dates from multiple tables that contain different date field.  let me explain further. please consider the following data

  

 

with summ as

(

SELECT 8521 AS cid, 'partial' as status,    to_date('2/16/2015 8:54:00 AM', 'mm/dd/yyyy hh:mi:ss am') as ev_dt,  123 as v_id from dual union all

SELECT 1428 AS cid, 'partial' as status,to_date('2/15/2015 5:28:00 PM', 'mm/dd/yyyy hh:mi:ss am') as ev_dt,      123 as v_id from dual union all

SELECT 7364 AS cid, 'complete' as status ,to_date('2/16/2015 2:15:00 AM', 'mm/dd/yyyy hh:mi:ss am') as ev_dt,    123 as v_id from dual union all

SELECT 8965 AS cid, 'complete' as status ,to_date('2/15/2015 8:03:00 PM', 'mm/dd/yyyy hh:mi:ss am') as ev_dt,    123 as v_id from dual union all

SELECT 6361 AS cid, 'complete' as status ,to_date('2/15/2015 8:17:00 PM', 'mm/dd/yyyy hh:mi:ss am') as ev_dt,    123 as v_id from dual union all

SELECT 6935 AS cid, 'partial' as status , to_date('2/16/2015 1:57:00 AM', 'mm/dd/yyyy hh:mi:ss am') as ev_dt,    123 as v_id from dual

)

,orders as

(

SELECT 8521 AS cid,  'attending' as data_val, to_date('2/16/2015 8:17:00 AM', 'mm/dd/yyyy hh:mi:ss am') as or_dt,  123 as v_id from dual union all

SELECT 8521 AS cid,  'phone' as data_val,      to_date('2/16/2015 8:17:00 AM', 'mm/dd/yyyy hh:mi:ss am') as or_dt,  123 as v_id from dual union all

SELECT 8521 AS cid,  'md' as data_val,         to_date('2/16/2015 8:17:00 AM', 'mm/dd/yyyy hh:mi:ss am') as or_dt,  123 as v_id from dual union all

SELECT 1428 AS cid, 'attending' as data_val, to_date('2/15/2015 4:59:00 PM', 'mm/dd/yyyy hh:mi:ss am') as or_dt,      123 as v_id from dual union all

SELECT 1428 AS cid, 'phone' as data_val,    to_date('2/15/2015 4:59:00 PM', 'mm/dd/yyyy hh:mi:ss am') as or_dt,      123 as v_id from dual union all

SELECT 1428 AS cid, 'md' as data_val,       to_date('2/15/2015 4:59:00 PM', 'mm/dd/yyyy hh:mi:ss am') as or_dt,      123 as v_id from dual union all

SELECT 8965 AS cid, 'attending' as data_val,  to_date('2/15/2015 8:01:00 PM', 'mm/dd/yyyy hh:mi:ss am') as or_dt,    123 as v_id from dual union all

SELECT 8965 AS cid,   'phone' as data_val, to_date('2/15/2015 8:01:00 PM', 'mm/dd/yyyy hh:mi:ss am') as or_dt,    123 as v_id from dual union all

SELECT 8965 AS cid, 'md' as data_val,  to_date('2/15/2015 8:01:00 PM', 'mm/dd/yyyy hh:mi:ss am') as or_dt,    123 as v_id from dual union all

SELECT 6935 AS cid, 'attending' as data_val,  to_date('2/16/2015 1:57:00 AM', 'mm/dd/yyyy hh:mi:ss am') as or_dt,    123 as v_id from dual union all

SELECT 6935 AS cid,  'phone' as data_val,  to_date('2/16/2015 1:57:00 AM', 'mm/dd/yyyy hh:mi:ss am') as or_dt,    123 as v_id from dual union all

SELECT 6935 AS cid,  'md' as data_val, to_date('2/16/2015 1:57:00 AM', 'mm/dd/yyyy hh:mi:ss am') as or_dt,    123 as v_id from dual

)

,detail as

(

  SELECT 8521 AS cid,  'date_Read' as data_val, to_date('3/17/2015 8:17:00 AM', 'mm/dd/yyyy hh:mi:ss am') as date_Read,  123 as v_id from dual union all

SELECT 1428 AS cid, 'date_Read' as data_val, to_date('2/24/2015 4:59:00 PM', 'mm/dd/yyyy hh:mi:ss am') as date_Read,      123 as v_id from dual union all

SELECT 8965 AS cid, 'date_Read' as data_val,  to_date('3/31/2015 8:01:00 PM', 'mm/dd/yyyy hh:mi:ss am') as date_Read,    123 as v_id from dual union all

SELECT 6935 AS cid,  'date_Read' as data_val, to_date('2/25/2015 1:57:00 AM', 'mm/dd/yyyy hh:mi:ss am') as date_Read,    123 as v_id from dual

)

i want to join all 3 tables (summ, orders,detail) by cid, v_id and i want to find the following.

from summ table i want to find the row with min ev_dt where status is complete.  from orders table i want to find the row with min or_dt

and from detail table i want to find out the row with min date_Read.  my output should look like this

vi_id        first_complete                  first_ordered                       first_read

123          2/15/2015 8:03:00 PM    2/15/2015 4:59:00 PM         2/24/2015 4:59:00 PM

my query looks like this but it is not completed

select * from (

SELECT  row_number () over (partition by v_id , status order by ev_dt) as first_completed,

                row_number () over (partition by v_id order by ord_dt) as first_ordered,

                row_number () over (partition by v_id order by date_Read) as first_read

  FROM summ a

   JOIN orders b

     on (a.v_id = b._vid)

  JOIN detail c

    on (a.v_id = c.v_id)

) where first_completed = 1 or (first_ordered = 1 and status='complete')

      or first_read = 1

can someone help me modify my query so that i can get the output describe above? im using oracle 11g

thanks in advance

Comments

843793
Well, this was a shot in the dark, but I tested it and it seems to be the problem: remove the parens around i.next()!

After doing so, running the code in your post instead provides a "NoSuchElementException" from the iterator (completely expected). I'm not sure if this a bug in the compiler, or if it has something to do with the way the code gets expanded. Maybe if someone thinks about it long enough they'll be able to come up with a reason.
843793
Why would you expect to use those parens like that anyway?
843793
Why would you expect to use those parens like that
anyway?
I can see that the parens are redundant - and as the other responder pointed out, the error goes away when they are removed...however, I'm still curious...

Firstly, is it actually an error to use the parentheses in that way?

Secondly, although the offending line is executed in the example I gave, the code that I pulled the example from is a bit stranger - when I try to instantiate a class (call it B), that contains a method with the redundant parentheses, I get the same error - even though the offending line isn't executed (I can post the code tonight if anyone is interested).

Gareth
843793
Here's the code:

import java.util.*;
class A {
public static void main (String argv[]) {
B bb = new B();
}
}

class B {

void methodC() {
ArrayList<Boolean> B = new ArrayList<Boolean>(10);
Iterator<Boolean> i = B.iterator();
boolean b = (i.next()).booleanValue();
}
}

843793
This is definitely a bug in the compiler. The bytecode generated for B.methodC() is:

Codeview "bytecode" for void B.methodC():
#3/Test.java:12 - new class java.util.ArrayList
#4/Test.java:12 - dup
#5/Test.java:12 - bipush (byte)10
#6/Test.java:12 - invokespecial public java.util.ArrayList(int)
#7/Test.java:12 - astore_1 lv_1
#8/Test.java:13 - aload_1 lv_1
#9/Test.java:13 - invokevirtual public java.util.Iterator java.util.AbstractList.iterator()
#10/Test.java:13 - astore_2 lv_2
#11/Test.java:14 - aload_2 lv_2
#12/Test.java:14 - invokeinterface public abstract java.lang.Object java.util.Iterator.next()
#13/Test.java:14 - invokevirtual public final boolean java.lang.Boolean.booleanValue()
#14/Test.java:14 - istore_3 lv_3
#15/Test.java:15 - return

and it's clear that between instruction #12 and instruction #14 a typecast is missing.

I'll add this to my list of known prototype compiler bugs at
http://cag.lcs.mit.edu/~cananian/Projects/GJ/
1 - 5

Post Details

Added on Mar 7 2020
8 comments
177 views