sql >> Databáze >  >> RDS >> Mysql

mysql vygeneruje chybějící data s předchozí hodnotou

Pro 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

Rekurzivní dotaz bude sestavovat řádek po řádku s přírůstkem data od prvního do posledního data. value (a col ) je převzato z původní tabulky, která je ponechána spojena k datu. Pokud původní tabulka neobsahuje řádek pro datum, použije se místo něj hodnota posledního řádku v rekurzi.

U starších verzí můžete použít tabulku kalendáře a poddotaz v levé klauzuli spojení ON k získání posledních existujících hodnot:

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

Aktualizovat

Protože se otázka změnila:

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

Ujistěte se, že máte index na (col, dt_id) . V nejlepším případě by to byl primární klíč. date_id v time_table by měl být také indexován nebo primární klíč.




  1. Vytvoření výchozího veřejného profilu pro databázovou poštu na serveru SQL Server (T-SQL)

  2. Načítání zařízení Django je velmi pomalé

  3. dotaz mysql ZOBRAZIT SLOUPCE Z tabulky jako 'název_sloupce':otázky

  4. SQLAlchemy Text Shoda dat uvnitř pole JSON s UTF-8