Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Deslizando certos registros para o final de uma execução da mesma data


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;