I am new to MySql and have been trying to learn it for a project. I have a table as below (Table 1) and I need the output from it as Table 2.
Table 1: Input Table +----+----------+-----+-----------+----------+ | ID | FRUIT_TYPE | FRUIT | CREATED_AT +----+----------+-----+-----------+----------+ | 1 | Drupes | plums | 2020-06-12 25:10:10 | 2 | Drupes | peaches | 2020-06-11 25:10:10 | 3 | Drupes | olives | 2020-06-11 24:10:10 | 4 | Berries | grapes | 2020-06-08 25:10:10 | 5 | Pomes | apples | 2020-06-07 25:10:10 | 6 | Pomes | pears | 2020-06-05 25:10:10 | 7 | Hesperidia | lemons | 2020-06-05 24:10:10 | 8 | Hesperidia | oranges | 2020-06-05 23:10:10 +----+----------+-----+-----------+----------+
Table 2: Final Output Desired +----+----------+-----+-----------+----------+ | ID | FRUIT_TYPE | FRUIT | CREATED_AT +----+----------+-----+-----------+----------+ | 3 | Drupes | olives | 2020-06-11 24:10:10 | 4 | Berries | grapes | 2020-06-08 25:10:10 | 6 | Pomes | pears | 2020-06-05 25:10:10 | 8 | Hesperidia | oranges | 2020-06-05 23:10:10 +----+----------+-----+-----------+----------+
The output is ordered by CREATED_AT field and if there are multiple rows for the same FRUIT_TYPE, the field with the least CREATED_AT value is picked.
For e..g of the 3 values for Drupes, only 1 row is taken where FRUIT is olives and the CREATED_AT values is the least.
If you put out the sql query, do explain it. 😛 Thanks in advance !
Advertisement
Answer
A simple method is a correlated subquery:
select t.* from t where t.created_at = (select min(t2.created_at) from t t2 where t2.fruit_type = t.fruit_type );
With an index on (fruit_type, created_at)
, this is likely to be the most performant method as well.