Solved

SQL Max Group By to get the second largest value

Posted on 2015-01-12
8
104 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
U.S. Department of Agriculture and Acronis Access

With the new era of mobile computing, smartphones and tablets, wireless communications and cloud services, the USDA sought to take advantage of a mobilized workforce and the blurring lines between personal and corporate computing resources.

 

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

Free eBook: Backup on AWS

Everything you need to know about backup and disaster recovery with AWS, for FREE!

Question has a verified solution.

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

'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 …
If you find yourself in this situation “I have used SELECT DISTINCT but I’m getting duplicates” then I'm sorry to say you are using the wrong SQL technique as it only does one thing which is: produces whole rows that are unique. If the results you a…
If you’ve ever visited a web page and noticed a cool font that you really liked the look of, but couldn’t figure out which font it was so that you could use it for your own work, then this video is for you! In this Micro Tutorial, you'll learn yo…
Add bar graphs to Access queries using Unicode block characters. Graphs appear on every record in the color you want. Give life to numbers. Hopes this gives you ideas on visualizing your data in new ways ~ Create a calculated field in a query: …

707 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