Mysql
 sql >> база данни >  >> RDS >> Mysql

mysql генерира липсващи дати с предишна стойност

За 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

Рекурсивната заявка ще изгражда ред по ред, увеличавайки датата, започвайки от първата дата до последната. valuecol ) се взема от оригиналната таблица, която остава свързана на дата. Ако оригиналната таблица няма ред за дата, вместо това се взема стойността на последния ред в рекурсията.

За по-стари версии можете да използвате вашата календарна таблица и подзаявка в лявата клауза joins ON, за да получите последните съществуващи стойности:

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

Актуализация

Тъй като въпросът се промени:

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

Уверете се, че имате индекс на (col, dt_id) . В най-добрия случай това ще бъде първичният ключ. date_id в time_table също трябва да бъде индексиран или първичен ключ.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Фатална грешка:Извикване на член функция bind_param() на булева

  2. jQuery ajax неограничено динамично поле за избор въз основа на родителски категории

  3. MySQL - Perl:Как да получите масив от пощенски кодове в рамките на изпратените x мили от изпратения пощенски код в пример на Perl

  4. Как да настроите индексната структура на ElasticSearch с множество обвързвания на обекти

  5. Две генерирани ценности в доктрината