sql >> Database teknologi >  >> RDS >> Oracle

SQL -- Udfyldning af datoer, der ikke har resultater

Afhængigt af hvordan du vil oprette dem, kan du enten oprette en kalendertabel eller generer rækkerne dynamisk ved hjælp af Oracle connect by syntaks.

with the_dates as (
  select max(trunc(Create_Dtime)) as max_date
       , min(trunc(Create_Dtime)) as min_date
    from player 
         )
  , generator as (
  select min_date + level as the_date
    from the_dates
 connect by level <= max_date
         )
select g.the_date, count(trunc(p.Create_Dtime))
  from generator g
  left outer join player p
    on g.the_date = trunc(p.Create_Dtime)
 group by g.the_date
 order by g.the_date desc

Hvis du går ned i kalendertabellen, er det en lille smule renere:

with the_dates as (
  select max(trunc(Create_Dtime)) as max_date
       , min(trunc(Create_Dtime)) as min_date
    from player 
         )
select c.the_date, count(trunc(p.Create_Dtime))
  from calender c
  join the_dates td
    on c.the_date between td.min_date and td.max_date
  left outer join join player p
    on c.the_date = trunc(p.Create_Dtime)
 group by c.the_date
 order by c.the_date

Eller lige efter at have bemærket dine datobegrænsninger:

with the_dates as (
  select to_date('07-05-2012','dd-mm-yyyy') + level as the_date
    from dual
 connect by level <= trunc(to_date('07-05-2012','dd-mm-yyyy') - sysdate)
         )
 select td.the_date, count(trunc(p.create_dtime))
   from the_dates td
   left outer join player p
     on td.the_date = trunc(p.create_dtime)
  group by td.the_date
  order by td.the_date

Til alle disse vil jeg anbefale et indeks på trunc(create_dtime) på din player tabel.




  1. MySQL Ugyldig standardværdi for tidsstempel, når der ikke er angivet nogen standardværdi.

  2. Ti tips til at gå i produktion med PostgreSQL

  3. Node.js MySQL-modul - smid fejl; // Genkast ikke-MySQL-fejl;

  4. EF Core `opdateringsdatabase` på MySql fejler med `__EFMigrationsHistory' eksisterer ikke`