'how to retrieve the first and last instance of a row in pdo dataset

I have a dataset that I retrieve using PDO and fetchall. I need to find the first date a part was sold and its cost then also I need to find the last date that part was sold and its cost. I believe I have the php code how I want it because it is returning all the data I need. The question I have then is, how can/should I get the first instance of the row with the date/cost and then the last instance of the row with the date/cost? For example, the part number below, 80049 has 6 rows in my dataset. each with a different sale date and cost. I can easily get the cost/date of the first row but in my code below it's printing out every date/cost instead of the last one. I know why it's doing that with my code so my question is how can I fix that behavior?

The end goal is for the layout to look something like:

Part: Description: First Sold: Cost: Last Sold: Cost:

80049 blah blah 2022-04-20 0.755 2022-04-25 0.755

php with table code:

$current_part = "";

$data = $sql->fetchall((PDO::FETCH_ASSOC));
echo "<table id='main'>
<tr>
    <th>Part</th>
    <th>Description</th>
    <th>Earliest Date</th>
    <th>Earliest Cost</th>
    <th>Last Date</th>
    <th>Last Cost</th>
</tr>";
foreach ($data as $row){
  if ($current_part != $row['part']){
     $current_part = $row['part'];
    echo "
          <tr>
            <td>";echo $current_part;echo"</td>
            <td>";echo $row['description'];echo"</td>
            <td>";echo $row['date_received'];echo"</td>
            <td>";echo $row['cost'];echo"</td>";
} else {
echo      "
             <td>";echo $row['date_received'];echo"</td>
             <td>";echo $row['cost'];echo"</td>
          </tr>";
 }
}
 echo "</table>";

Output

Example Records



Solution 1:[1]

The answer is actually to change the pervasive query I was using. This was the query I was using to begin with:

select part,cost,description,date_received,qty_received
from v_po_history 
where part not like '*%' and date_received >= '2022-04-01' and date_received <= '2022-04-30' and location = 'HS' 
order by part, date_received asc

And the answer:

select part,min(cost) as Lowest_Cost,max(cost) as Highest_Cost, min(date_received) as First_date, max(date_received) as Last_Date, description, (max(cost) - min(cost)) as Difference
from v_po_history 
where part not like '*%' and date_received >= '2022-04-01' and date_received <= '2022-04-30' and location = 'HS'
group by part,description

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 SkylarP