Dit is ingewikkeld. Eerst moet je opeenvolgende datumrecords vinden, dus met
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
u zou 2014-07-12 identificeren als één voorval voor de eerste drie records en een andere voor het laatste record. Het tweede record zou positie #3 in je resultaten moeten krijgen, niet #5.
U bereikt dit door opeenvolgende records een groepssleutel te geven door eerst LAG
. te gebruiken om in het vorige record te kijken, waardoor een vlag wordt gemaakt bij groepswisseling en deze vlaggen vervolgens worden gecumuleerd.
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;