C'est compliqué. Vous devez d'abord trouver des enregistrements de date consécutifs, donc avec
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
vous identifieriez 2014-07-12 comme une occurrence pour les trois premiers enregistrements et une autre pour le dernier enregistrement. Le deuxième enregistrement devrait obtenir la position #3 dans vos résultats, pas #5.
Vous y parvenez en donnant aux enregistrements consécutifs une clé de groupe en utilisant d'abord LAG
pour regarder dans l'enregistrement précédent, créant ainsi un drapeau sur changement de groupe, puis cumulant ces drapeaux.
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;