my %data; while (my @col = $dbh->fetchrow_array) { if (exists $data{$col[1]}) { $data{$col[1]}{min} = $col[0] if $col[0] < $data{$col[1]}{min}; push @{$data{$col[1]}{entry}}, \@col1; } else { $data{$col[1]}{min} = $col[0]; $data{$col[1]}{entry} = [\@col]; } } for my $state (sort {$a->{min} <=> $b->{min}} keys %data) { for my $entry (sort {$a->[0] <=> $b->[0]} values %{$data{$state}{entry}}) { print "@$entry\n"; } }