Mysql
 sql >> Baza danych >  >> RDS >> Mysql

mysql generuje brakujące daty z poprzednią wartością

Dla MySQL 8:

with recursive rcte(dt_id, col, value) as (
  (
    select dt_id, col, value
    from mytable
    order by dt_id
    limit 1
  )
  union all
  select r.dt_id + interval 1 day
       , coalesce(t.col, r.col)     
       , coalesce(t.value, r.value)
  from rcte r
  left join mytable t on t.dt_id = r.dt_id + interval 1 day
  where r.dt_id < (select max(dt_id) from mytable)
)
select r.col, r.dt_id, r.value
from rcte r
order by r.dt_id

db-fiddle

Zapytanie rekurencyjne zbuduje wiersz po wierszu, zwiększając datę od pierwszej do ostatniej daty. value (i col ) jest pobierana z oryginalnej tabeli, która pozostaje dołączona w dniu. Jeśli oryginalna tabela nie zawiera wiersza dla daty, zamiast tego pobierana jest wartość ostatniego wiersza w rekursji.

W przypadku starszych wersji możesz użyć tabeli kalendarza i podzapytania w klauzuli ON sprzężeń po lewej stronie, aby uzyskać ostatnie istniejące wartości:

select b.col, c.date_id, b.value
from time_table c
left join balance b on b.dt_id = (
  select max(dt_id)
  from balance b1
  where b1.dt_id <= c.date_id
)
where c.date_id >= (select min(dt_id) from balance)
  and c.date_id <= (select max(dt_id) from balance)

db-fiddle

Aktualizacja

Ponieważ pytanie się zmieniło:

select b.col, c.date_id, b.value
from (
  select col, min(dt_id) as min_dt, max(dt_id) as max_dt
  from balance
  group by col
) i
join time_table c
  on  c.date_id >= i.min_dt
  and c.date_id <= i.max_dt
left join balance b
  on  b.col = i.col
  and b.dt_id = (
    select max(dt_id)
    from balance b1
    where b1.dt_id <= c.date_id
      and b1.col = i.col
)
order by b.col, c.date_id

db-fiddle

Upewnij się, że masz indeks na (col, dt_id) . W najlepszym przypadku byłby to klucz podstawowy. date_id w time_table powinien być również indeksowany lub kluczem podstawowym.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JDBC/Connectorj:Zrozumienie puli połączeń

  2. MySQL:Optymalizacja GROUP BY wiele kluczy

  3. Jak mogę WYBRAĆ wiersze z MAX (wartość kolumny), PARTITION według innej kolumny w MYSQL?

  4. Dlaczego nie mogę połączyć się bezpośrednio z moją instancją MySQL RDS DB? (Mogę połączyć się tylko przez SSH z EC2)

  5. Podziel plik mysqldump z wieloma bazami danych według bazy danych