Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Verschieben bestimmter Datensätze an das Ende eines Laufs desselben Datums

Das ist kompliziert. Zuerst müssen Sie aufeinanderfolgende Datumsangaben finden, also mit

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

Sie würden 2014-07-12 als ein Vorkommen für die ersten drei Datensätze und ein weiteres für den letzten Datensatz identifizieren. Der zweite Datensatz müsste Position #3 in Ihren Ergebnissen bekommen, nicht #5.

Dies erreichen Sie, indem Sie aufeinanderfolgenden Datensätzen einen Gruppenschlüssel geben, indem Sie zuerst LAG verwenden um in den vorherigen Datensatz zu schauen, wodurch ein Flag bei Gruppenwechsel erstellt wird und diese Flags dann kumuliert werden.

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;