My table looks like this.
Location Head Id IntTime
1 AMD 1 1
2 INTC 3 3
3 AMD 2 2
4 INTC 4 4
5 AMD2 1 0
6 ARMH 5 1
7 ARMH 5 0
8 ARMH 6 1
9 AAPL 7 0
10 AAPL 7 1
Location is the primary key. I need to GROUP BY Head and by Id and when I use GROUP BY, I need to keep the row with the smallest IntTime.
After the first GROUP BY Id, I should get (I keep the smallest IntTime)
Location Head Id IntTime
2 INTC 3 3
3 AMD 2 2
4 INTC 4 4
5 AMD2 1 0
7 ARMH 5 0
8 ARMH 6 1
9 AAPL 7 0
After the second GROUP BY Head, I should get (I keep the smallest IntTime)
Location Head Id IntTime
2 INTC 3 3
3 AMD 2 2
5 AMD2 1 0
7 ARMH 5 0
9 AAPL 7 0
When I run the following command, I keep the smallest IntTime but the rows are not conserved.
SELECT Location, Head, Id, MIN(IntTime) FROM test
GROUP BY Id
Also, to run the second GROUP BY, I save this table and do again
SELECT Location, Head, Id, MIN(IntTime) FROM test2
GROUP BY Head
Is there a way to combine both commands?
[Edit: clarification]
The result should not contain two Head with the same value or two Id with the same value.
When deleting those duplicates, the row with the smallest IntTime should be kept.
This query returns the exact final results you’re looking for (example):
How it works
The innermost query groups by
Id, and returns theIdand correspondingMIN(intTime). Then, the middle query groups byHead, and returns theHeadand correspondingIdandMIN(intTime). The final query returns all rows, after being narrowed down. You can think of the final (outermost) query as a query on a table with only the rows you want, so you can do additional comparisons (e.g.WHERE final.intTime > 3).