sql >> Database >  >> RDS >> Oracle

Bepaalde records naar het einde van een run van dezelfde datum schuiven

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;


  1. Concat-veldwaarde naar tekenreeks in SQL Server

  2. Verbind de python-app met een database met behulp van centos 7

  3. Is de volgende code geldig?

  4. Oracle - tijdstempel uit varchar-string halen?