Tem várias opções ao meu ver.
---------------------------------------
data = 0;
se data diferente da anterior,
mostra data atual, e data anterior recebe atual
echo linha
senão
echo linha
--------------------------------------------
segunda opção é bem mais custosa (mas dependendo o servidor e qtd de registros, não é tanto)
foreach ($linhas as $linha)
$array_datas[$linha->data][] = $linha;
foreach ($array_datas as $data => $array_linhas)
echo $data
foreach($array_linhas)
echo $linha
-----------------------------------------------
terceira, mas gera muitas consultas ao banco
$sql "select datas from X group by data"
foreach ($resultado_datas)
$sql "select * from X where data = $data"
foreach ($resultado_x as $linha)
echo $linha
----------------------------------------------
Desculpe pelas opções "gambiarristicas" mas nunca me deparei com soluções muito otimizadas pra isso