• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 9533
  • Last Modified:

selecting a max within a max oracle query.

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
Sanmarie
Asked:
Sanmarie
  • 2
  • 2
2 Solutions
 
TaygerCommented:
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
 
NicksonKohCommented:
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
 
SanmarieAuthor Commented:
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
 
SanmarieAuthor Commented:
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
 
TaygerCommented:
Your welcome, glad I coud help.

Regards
Tayger
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Ultimate Tool Kit for Technology Solution Provider

Broken down into practical pointers and step-by-step instructions, the IT Service Excellence Tool Kit delivers expert advice for technology solution providers. Get your free copy now.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now