I am writing a query that groups a table of users by (height, sex)
and then gets the name of the user with the minimum weight for that combination of height
and sex
.
If you wanna skip to the actual query, here is the SQLFiddle with a minimal representative example.
If you don’t want to open that url, here is what I am talking about. Given a table such as:
x
| height | sex | name | weight |
|-------:|--------|---------|--------|
| 100 | female | Alice | 150 |
| 100 | female | Barbara | 130 |
| 100 | female | Candice | 100 |
and a query that does this as follows:
SELECT name, min(weight) from users
group by height, sex
Why does the query output:
| name | min(weight) |
|------:|-------------|
| Alice | 100 |
What I actually want is Candice, 100
not Alice, 100
.
I figured out it chooses Alice because it is the first row, but why does it do that? It’s really weird and unexpected.
Advertisement
Answer
I would use a correlated subquery, but not with fancy logic:
select u.*
from users u
where u.weight = (select min(u2.weight)
from users u2
where u2.height = u.height and u2.sex = u.sex
);
That is, return the users whose weight is the minimum for the height
/sex
combination.