Solved

SQL Max Group By to get the second largest value

Posted on 2015-01-12
8
103 Views
Last Modified: 2015-01-12
Hi there,

I have the below query to obtain the largest value using group by to get the largest size_min value for each model type. However I would like to get the second largest value for size_min using the same premise of which groups by model_type gets the max size_min but obtaining the actual value for price_1 and price_2 like below.

I may have confused you there,  but I have also attached a spreadsheet which better illustrates what I would like to do:

SELECT        tt.model_ID, tt.model_type, tt.size_min, tt.model_price_1, tt.model_price_2
FROM            dbo.Model AS tt INNER JOIN
                             (SELECT        model_type, MAX(size_min) AS MaxMin
                               FROM            dbo.Model E1
                               GROUP BY model_type) AS groupedtt ON tt.model_type = groupedtt.model_type AND tt.size_min = groupedtt.MaxMin;

Open in new window



I  hope this makes sense and thank you for your help in advance.
Table-structure-and-results.xls
0
Comment
Question by:databarracks
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 6
  • 2
8 Comments
 
LVL 143

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 40546069
to get the Nth number in an order you can use ROW_NUMBER() function in a subquery, similarly to what I suggest in this article:http://www.experts-exchange.com/Database/Miscellaneous/A_3203-DISTINCT-vs-GROUP-BY-and-why-does-it-not-work-for-my-query.html

select * from (
SELECT        tt.model_ID, tt.model_type, tt.size_min, tt.model_price_1, tt.model_price_2
  , row_number() over (partition by tt.model_ID, tt.model_type  order by  tt.size_min desc ) rn
FROM            dbo.Model AS tt
)
where rn = 2

Open in new window


the issue that I see is that if there is only 1 single record for a "partition", it will not return anything...
in that case, we can add something like this to make sure we still get at least 1 row


select * from (
SELECT        tt.model_ID, tt.model_type, tt.size_min, tt.model_price_1, tt.model_price_2
  , row_number() over (partition by tt.model_ID, tt.model_type  order by  tt.size_min desc ) rn
 , count(*) over ( partition by tt.model_ID, tt.model_type  ) cnt
FROM            dbo.Model AS tt
)
where rn = 2 or cnt = 1

Open in new window

0
 

Author Comment

by:databarracks
ID: 40546072
Hi Guy,

I am getting incorrect syntax here FROM  dbo.Model AS tt)
0
 
LVL 143

Accepted Solution

by:
Guy Hengel [angelIII / a3] earned 500 total points
ID: 40546075
sorry, I forgot the alias for the subquery
select * from (
SELECT        tt.model_ID, tt.model_type, tt.size_min, tt.model_price_1, tt.model_price_2
  , row_number() over (partition by tt.model_ID, tt.model_type  order by  tt.size_min desc ) rn
 , count(*) over ( partition by tt.model_ID, tt.model_type  ) cnt
FROM            dbo.Model AS tt
) sq
where rn = 2 or cnt = 1
                                          

Open in new window

0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:databarracks
ID: 40546077
Hey Guy,

That fixed the error but I am getting all the rows and not 3 rows as per my spreadsheet?
0
 

Author Comment

by:databarracks
ID: 40546080
When I run the query all rn and cnt values are 1???
0
 

Author Comment

by:databarracks
ID: 40546082
Ahhhh alas It was because of the id column inside the partition statement. Seeing as they are unique it makes sense. Removed this from the query and it works:)
0
 

Author Comment

by:databarracks
ID: 40546083
Many thanks for your help on this Guy, you have been tremendous
0
 

Author Closing Comment

by:databarracks
ID: 40546084
Excellent, responsive and also added extra information which is helpful. Brilliant stuff
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

Naughty Me. While I was changing the database name from DB1 to DB_PROD1 (yep it's not real database name ^v^), I changed the database name and notified my application fellows that I did it. They turn on the application, and everything is working. A …
'Between' is such a common word we rarely think about it but in SQL it has a very specific definition we should be aware of. While most database vendors will have their own unique phrases to describe it (see references at end) the concept in common …
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …

732 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