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

SQL MAX Help

Hi,
I have a very simple select statement that returns this dataset

SELECT parent_id, component_id, control_id FROM item where parent_id = '14923'

parent_id      component_id      control_id
14923      12054      53715
14923      12054      53721
14923      12054      53715
14923      12054      53721
14923      12423      53715
14923      12423      53721
14923      14176      53715
14923      14176      53721
14923      14783      53715
14923      14783      53721
14923      14795      53715
14923      14795      53721
14923      14840      53715
14923      14840      53721
14923      14880      53715
14923      14880      53721
14923      14924      53715
14923      14924      53721
14923      14926      53715
14923      14926      53721


I need to add an additional where clause that only returns the highest control values, so in this case the returned dataset would look like this:

parent_id      component_id      control_id
14923      12054      53721
14923      12054      53721
14923      12423      53721
14923      14176      53721
14923      14783      53721
14923      14795      53721
14923      14840      53721
14923      14880      53721
14923      14924      53721
14923      14926      53721

Any suggestions as to how I can accomplish this please
0
andyw27
Asked:
andyw27
  • 4
  • 2
  • 2
  • +2
1 Solution
 
Dan CraciunIT ConsultantCommented:
Maybe something like this (untested):
SELECT parent_id, component_id, control_id 
FROM item 
WHERE parent_id = '14923' AND control_id = (SELECT MAX(control_id) FROM item WHERE parent_id = '14923')

Open in new window

HTH,
Dan
0
 
Vikas GargBusiness Intelligence DeveloperCommented:
HI,

Select Parent_id, Component_id, (select max(control_id) from table) ControlID from Table

Open in new window

0
 
Vitor MontalvãoMSSQL Senior EngineerCommented:
Use the MAX() function:
SELECT parent_id, component_id, MAX(control_id)
FROM item 
WHERE parent_id = '14923'
GROUP BY parent_id, component_id

Open in new window

0
Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
Jim HornMicrosoft SQL Server Developer, Architect, and AuthorCommented:
The above answer is correct.

If you want to eliminate duplicates, use DISTINCT.
SELECT DISTINCT parent_id, component_id, MAX(control_id)
FROM item 
WHERE parent_id = '14923'
GROUP BY parent_id, component_id

Open in new window

Also, if you'd like further reading on aggregates such as MAX then I have an article out there called SQL Server GROUP BY Solutions that would be an excellent reading.
0
 
Vitor MontalvãoMSSQL Senior EngineerCommented:
Jim, you won't need the DISTINCT since it's already aggregate by parent_id and component_id so duplicates will be automatically dropped.
0
 
andyw27Author Commented:
Thanks, worked like a charm.
0
 
Vitor MontalvãoMSSQL Senior EngineerCommented:
Andy, any of these solutions works (Vikas forgot the WHERE clause) but there's no need to use subselects.
You can do it in a more direct and efficient way.

Cheers
0
 
Dan CraciunIT ConsultantCommented:
Glad I could help!

@Vitor and Jim: on your queries, if a component_id does not have a row where control_id is 53721, it will be listed with the highest control_id value if finds. The OP wanted only rows where control_id is 53721. At least that's the way I understood the question.
0
 
Vitor MontalvãoMSSQL Senior EngineerCommented:
Dan, I didn't understand the question like that:
where clause that only returns the highest control values
0
 
Vikas GargBusiness Intelligence DeveloperCommented:
Hello,

SELECT parent_id, component_id, control_id FROM item a
INNER JOIN
(Select Parent_id, Component_id, (select max(control_id) from item) ControlID from item) B
ON A.parent_id = B.Parent_id AND A.component_id = B.component_id AND A.control_id = B.control_id
0
 
Jim HornMicrosoft SQL Server Developer, Architect, and AuthorCommented:
Vitor - You are correct.  What was I thinking...
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

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

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