I am having trouble writing a query that will select all Skills, joining the Employee and Competency records, but only return one skill per employee, their newest Skill. Using this sample dataset
Skills
======
id employee_id competency_id created
1 1 1 Jan 1
2 2 2 Jan 1
3 1 2 Jan 3
Employees
===========
id first_name last_name
1 Mike Jones
2 Steve Smith
Competencies
============
id title
1 Problem Solving
2 Compassion
I would like to retrieve the following data
Skill.id Skill.employee_id Skill.competency_id Skill.created Employee.id Employee.first_name Employee.last_name Competency.id Competency.title
2 2 2 Jan 1 2 Steve Smith 2 Compassion
3 1 2 Jan 3 1 Mike Jones 2 Compassion
I was able to select the employee_id and max created using
SELECT MAX(created) as created, employee_id FROM skills GROUP BY employee_id
But when I start to add more fields in the select statement or add in a join I get the ‘Column ‘xyz’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.’ error.
Any help is appreciated and I don’t have to use GROUP BY, it’s just what I’m familiar with.
The error that you were getting is because SQL Server requires any item in the
SELECTlist to be included in theGROUP BYif there is an aggregate function being used.The problem with that is you might have unique values in some columns which can throw off the result. So you will want to rewrite the query to use one of the following:
You can use a subquery to get this result. This gets the
max(created)in a subquery and then you use that result to get the correct employee record:See SQL Fiddle with Demo
Or another way to do this is to use
row_number():See SQL Fiddle with Demo