Oracle
 sql >> Base de données >  >> RDS >> Oracle

Faire glisser certains enregistrements à la fin d'une exécution de la même date

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;