Solved

selecting a max within a max oracle query.

Posted on 2007-03-23
5
9,514 Views
Last Modified: 2013-12-19
Using oracle 8.
I am using the following query in an oracle function but I want to know if it could be written better. I have a table "my table" which has two sequence numbers "sequence_no" and "seq_no." I want to find the maximum "sequence_no" for a particular key "my_key". But when I find this max sequence_no, I have to find the maximum seq_no within that maximum sequence_no. HOpe I didn't confuse you. Help and Thanks

SELECT decode(my_value,'Y','Fuel')
                  INTO ls_temp
                  FROM  my_table
                  WHERE
                        util_name = 'h$_fuel'
                        AND my_value = 'Y'
                        AND key = my_key
                        AND sequence_no =
                              (SELECT max(sequence_no)
                               FROM my_table
                               WHERE util_name = 'h$_fuel' AND key = my_key
                               )
                        AND seq_no =
                              (SELECT max(seq_no)
                              FROM my_table
                              WHERE util_name = 'h$_fuel' AND key = my_key
                              AND sequence_no =
                                    (SELECT max(sequence_no)
                                          FROM my_table
                                          WHERE util_name = 'h$_fuel' AND key = my_key
                                    )
                              );

0
Comment
Question by:Sanmarie
  • 2
  • 2
5 Comments
 
LVL 2

Accepted Solution

by:
Tayger earned 400 total points
ID: 18783877
Hello
I dont know whats the idea behind your select statement. From perfomance view you access the same table twice by full table scan. This is not a biggy if the table is small.
The other thing that confuses is me is the way you accessing the data by max(seq). Looks like you want to kinda get the "the latest" record of a data group (?). How about a timestamp instead of a sequence, even tough this wont solve your problem. Maybe there is something wrong in your DB design.

In general and not tested, but how about that way:
SELECT decode(my_value,'Y','Fuel')
                  INTO ls_temp
                  FROM  my_table
                  WHERE util_name = 'h$_fuel'
                        AND my_value = 'Y'
                        AND key = a.my_key  -- key = function input parameter?
                        AND rownum = 1
                        ORDER BY sequence_no DESC, seq_no DESC

Not tested but it should return you the first found my_value (rownum = 1) orderded first by biggest sequence_no, then biggest seq_no. Its also guaranteed you only get 1 record back (if found), instead of error message: too many records.
If this wont help could you let me know whats the main idea of the two sequences in that table and if sequence_no and/or sequence:no can have the same number (sequence) more than once?
Hope I could help
Tayger
0
 
LVL 17

Assisted Solution

by:NicksonKoh
NicksonKoh earned 100 total points
ID: 18790290
Hi,

You can simplify the SQL as follows :

SELECT DECODE (my_value, 'Y', 'Fuel')
  INTO ls_temp
  FROM my_table a,
       (SELECT my_key KEY, MAX (sequence_no)
          FROM my_table
         WHERE util_name = 'h$_fuel' AND KEY = my_key) b
 WHERE (a.KEY = b.KEY AND a.sequence_no = b.sequence_no)
   AND a.util_name = 'h$_fuel'
   AND a.my_value = 'Y'
   AND a.KEY = my_key

Check whether the result is correct because I am a little confused by your my_value = 'Y' condition which I try to just follow as what u did in your original SQL.

cheers
Nickson
0
 

Author Comment

by:Sanmarie
ID: 18792975
Hi Tayger and NicksonKoh,

Sorry  I took so long to get back to you both. Tayger, you are right I access the same table twice. I have two columns, sequence_no and seq_no. I want to get the maximum seq_no in the maximum sequence_no group. Get it? I agree that the database design is bad but unfortunately, that is the design that I have to work with.

I will try both your suggestions and get back to you today.

San
0
 

Author Comment

by:Sanmarie
ID: 18794034
Tayger,
Your query worked perfectly with a slight change. Thank you very much.

NicksonKoh thanks for helping out too but I will go with Tayger's solution.

San
0
 
LVL 2

Expert Comment

by:Tayger
ID: 18794222
Your welcome, glad I coud help.

Regards
Tayger
0

Featured Post

Live: Real-Time Solutions, Start Here

Receive instant 1:1 support from technology experts, using our real-time conversation and whiteboard interface. Your first 5 minutes are always free.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Oracle 10g - insert string with special characters 8 55
Consolidating oracle query results to a single line 8 60
SQL query question 8 73
Help on model clause 5 29
Introduction A previously published article on Experts Exchange ("Joins in Oracle", http://www.experts-exchange.com/Database/Oracle/A_8249-Joins-in-Oracle.html) makes a statement about "Oracle proprietary" joins and mixes the join syntax with gen…
Background In several of the companies I have worked for, I noticed that corporate reporting is off loaded from the production database and done mainly on a clone database which needs to be kept up to date daily by various means, be it a logical…
Via a live example show how to connect to RMAN, make basic configuration settings changes and then take a backup of a demo database
This videos aims to give the viewer a basic demonstration of how a user can query current session information by using the SYS_CONTEXT function

786 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question