neodani, convierte la fecha a segundos, divide por 1800, que son los segundos de 30 minutos. A ver si me explico
agrupas los resultados por el valor entero superior (FLOOR(x)) de la operacion de dividir la fecha convertida a segundos TO_SECONDS(fecha) por 1800, que son los segundos de media hora.
No he probado nada y tampoco estoy seguro, pero se me ocurre algo así: