Isso é complicado. Primeiro você deve encontrar registros de datas consecutivas, então com
thedate theid thetype 2014-07-12 5001 59 2014-07-12 5002 101 2014-07-12 5003 88 2014-07-13 5004 10 2014-07-12 5005 60
você identificaria 2014-07-12 como uma ocorrência para os três primeiros registros e outra para o último registro. O segundo registro teria que ficar na posição #3 em seus resultados, não #5.
Você consegue isso dando aos registros consecutivos uma chave de grupo usando o primeiro
LAG
para examinar o registro anterior, criando assim um sinalizador na mudança de grupo e, em seguida, acumulando esses sinalizadores. select thedate, theid, thetype
from
(
select
thedate, theid, thetype,
sum(new_group) over (order by theid) as group_key
from
(
select
thedate, theid, thetype,
case when lag(thedate) over (order by theid) = thedate then 0 else 1 as new_group
from mytable
) marked
) grouped
order by
group_key,
case when thetype = 101 then 1 else 0 end,
theid;