Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

mysql tạo các ngày bị thiếu với giá trị trước đó

Đối với 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

Truy vấn đệ quy sẽ xây dựng từng hàng tăng dần ngày bắt đầu từ ngày đầu tiên cho đến ngày cuối cùng. Giá trị value (và col ) được lấy từ bảng gốc, được kết hợp với ngày. Nếu bảng ban đầu không có hàng cho một ngày, giá trị của hàng cuối cùng trong đệ quy sẽ được lấy thay thế.

Đối với các phiên bản cũ hơn, bạn có thể sử dụng bảng lịch của mình và truy vấn con ở bên trái kết hợp mệnh đề BẬT để nhận các giá trị hiện có cuối cùng:

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

Cập nhật

Vì câu hỏi đã thay đổi:

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

Đảm bảo rằng bạn có chỉ mục trên (col, dt_id) . Trong trường hợp tốt nhất, nó sẽ là khóa chính. date_id trong time_table cũng nên được lập chỉ mục hoặc khóa chính.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Di chuyển cơ sở dữ liệu mysql từ máy chủ này sang máy chủ khác

  2. Sử dụng MySql giữa mệnh đề với ngày tháng

  3. Có tương đương với SET NOCOUNT của SQL Server trong MySQL không?

  4. Tại sao MySQL tự động chuyển đổi chuỗi thành số?

  5. Làm thế nào để khôi phục cơ sở dữ liệu mysql trong XAMPP?