mysql 用以前的值生成缺失的日期

2024-03-20

下面是一个具有稀疏日期的 mysql 表。

col dt_id  value
A1 2018-05-28 30
A1 2018-05-30 20
A1 2018-05-31 50
A1 2018-06-01 50
A1 2018-06-04 80
A1 2018-06-05 50

输出应如下所示,其中缺失的日期与最后一个值一起填充。

col dt_id  value
A1 2018-05-28 30
A1 2018-05-29 30
A1 2018-05-30 20
A1 2018-05-31 50
A1 2018-06-01 50
A1 2018-06-02 50
A1 2018-06-03 50
A1 2018-06-04 80
A1 2018-06-05 50

这里生成了以下内容。

A1 2018-05-29 30
A1 2018-06-02 50
A1 2018-06-03 50

我知道使用 oracle 的解决方案last_value() over (partition by..,但由于这是mysql,所以有点棘手。

这是我尝试过的:

创建时间表并填充数据:

CREATE TABLE `time_table` (date_id date not null);
create table ints ( i tinyint ); insert into ints values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); 

insert into time_table (date_id) select date('2016-09-01')+ interval a.i*10000 + b.i*1000 + c.i*100 + d.i*10 + e.i day 
from ints a 
join ints b 
join ints c 
join ints d 
join ints e 
where (a.i*10000 + b.i*1000 + c.i*100 + d.i*10 + e.i) <= 11322 order by 1;

select * from time_table limit 10;
+------------+
| date_id    |
+------------+
| 2018-09-22 |
| 2018-09-21 |
| 2018-09-20 |
| 2018-09-19 |
| 2018-09-18 |
| 2018-09-17 |
| 2018-09-16 |
| 2018-09-15 |
| 2018-09-14 |
| 2018-09-13 |
+------------+

Here is the data for the balance table:
Here is the data
+------+------------+-------+
| A1   | 2018-05-28 |    30 |
| A1   | 2018-05-30 |    20 |
| A1   | 2018-05-31 |    50 |
| A1   | 2018-06-01 |    50 |
| A1   | 2018-06-04 |    80 |
| A1   | 2018-06-05 |    50 |
| B1   | 2018-05-28 |    30 |
| B1   | 2018-05-30 |    20 |
| B1   | 2018-05-31 |    50 |
| B1   | 2018-06-01 |    50 |
| B1   | 2018-06-04 |    80 |
| B1   | 2018-06-05 |    50 |
| C1   | 2018-05-28 |    30 |
| C1   | 2018-05-30 |    20 |
| C1   | 2018-05-31 |    50 |
| C1   | 2018-06-01 |    50 |
| C1   | 2018-06-04 |    80 |
| C1   | 2018-06-05 |    50 |
| D1   | 2018-06-28 |    30 |
| D1   | 2018-07-02 |    20 |
| D1   | 2018-07-04 |    50 |
| D1   | 2018-07-08 |    80 |
| D1   | 2018-07-19 |    50 |
+------+------------+-------+


mysql> select b.id, ab.id, tt.`date_id` as cal_date, b.`mx` as ex_date, val
    -> from time_table tt
    -> inner join (select id, min(date_id) mi, max(date_id) mx from balance group by id) b
    -> on tt.`date_id` >= b.`mi`
    -> and tt.`date_id` <= b.mx
    -> left join (select id, date_id, sum(value) val from balance group by id, date_id) ab
    -> on ab.id = b.id and tt.`date_id` = ab.date_id
    -> order by cal_date;
+------+------+------------+------------+------+
| id   | id   | cal_date   | ex_date    | val  |
+------+------+------------+------------+------+
| A1   | A1   | 2018-05-28 | 2018-06-05 |   30 |
| A1   | NULL | 2018-05-29 | 2018-06-05 | NULL |
| A1   | A1   | 2018-05-30 | 2018-06-05 |   20 |
| A1   | A1   | 2018-05-31 | 2018-06-05 |   50 |
| A1   | A1   | 2018-06-01 | 2018-06-05 |   50 |
| A1   | NULL | 2018-06-02 | 2018-06-05 | NULL |
| A1   | NULL | 2018-06-03 | 2018-06-05 | NULL |
| A1   | A1   | 2018-06-04 | 2018-06-05 |   80 |
| A1   | A1   | 2018-06-05 | 2018-06-05 |   50 |
+------+------+------------+------------+------+


对于 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

数据库小提琴 https://www.db-fiddle.com/f/sYjyWPoc44MstYvPYcD1Bs/0

递归查询将逐行构建,从第一个日期到最后一个日期递增日期。这value (and col) 取自原始表,该表按日期左连接。如果原始表没有日期行,则采用递归中最后一行的值。

对于旧版本,您可以使用日历表和左连接 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)

数据库小提琴 https://www.db-fiddle.com/f/4fJSJzJrFySt4eLw5TUsaT/0

Update

由于问题已经改变:

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

数据库小提琴 https://www.db-fiddle.com/f/9CBq6BFRRXi8AyntxpDzQv/0

确保您有索引(col, dt_id)。在最好的情况下,它将是主键。date_id in the time_table还应该是索引或主键。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql 用以前的值生成缺失的日期 的相关文章

随机推荐

  • 无法在类中实例化通用数据类型

    我有一个不可变的类 具有以下布局 public final class A
  • 如何使用 quazip 压缩目录/文件夹?

    我有一个目录 其中包含我想要压缩的文件和文件夹 我正在使用 qt project quazip 所以我想我写一个函数来打包目录的所有内容 包括文件结构 如何在 zip 文件中创建文件夹 我尝试使用 QuaZipNewInfo 但无法使其工作
  • C#“共享指针”用于替代内存管理?

    我正在寻找一种在 C 中执行此操作的方法 Asker 对象将向 Giver 对象询问 Resource 对象 当被询问时 给予者将在其词典中搜索现有的匹配资源 如果找到 它将返回资源的引用 否则 它将根据数据库数据创建一个新的资源 将该引用
  • jQuery Mobile 不在动态复选框上应用样式并且无法单击

    我试图刷新在菜单选项卡页脚单击时附加在字段集标记中的复选框数量 第一次选项卡访问没问题 但此后 所有复选框都无法再选中 我已经多次修改我的代码 但它不起作用 有时可以检查它们但不应用样式 有时无法检查它们 但应用了样式 我努力了 contr
  • 为什么现实世界中我们需要 Deque 数据结构? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 谁能给我举一个情况的例子Deque https en wikipedia org wiki Double ended queue需要数
  • Silverlight-Facebook 应用程序的服务器接口单元测试

    我有一个 Silverlight 4 客户端在 Google App Engine 上托管的 Facebook 页面上运行 它正在使用gminifb http blog patrickcrosby com 2008 04 20 Write
  • 如何通过 OAuth2 从 vKontakte (VK) 获取访问令牌?

    我正在尝试通过 vKontakte 俄罗斯社交网络 获取访问令牌他们的 OAuth2 API https vk com dev auth mobile 这就是我拨打电话的方式 https oauth vk com authorize cli
  • 录音应用程序的 iOS 多任务处理

    我正在编写一个录制音频的应用程序 我正在研究在录音时支持多任务处理 在后台 的可行性 答案似乎是一个no根据我到目前为止所读到的内容 特别是因为该程序旨在释放切换时正在使用的任何系统资源 所以我想知道 是否可以让用户切换到 iOS 中的另一
  • 我的网络应用程序仅适用于 META-INF 而不是 WEB-INF(包括 beans.xml)。为什么?

    我正在研究 java 中的依赖注入示例 大多数文档都强调我必须放置一个空的beans xml in META INF 如果是 jar 应用程序 WEB INF 如果是 Web 应用程序 所以 我使用战争类型的包装 但是 我的应用程序只有在我
  • jQuery 模糊和 Enter 键

    我正在尝试根据输入的邮政编码使用谷歌地图动态更新 div 如果用户按 Tab 键离开输入框 id ZipCode 则它工作正常 但如果他们按 Enter 键 则不会模糊该字段 我在 onkeyup 上有一个变体 但一个事件调用另一个事件 结
  • 如何在android库中包含内部jar文件

    我正在尝试下载并运行现有的 android studio 项目 目前我收到错误 error package com google gson does not exist 需要gson的java文件位于主应用程序部分 这gson 2 8 1
  • 无法在 Eclipse 中对空手道模板项目运行 mvn 测试

    我克隆了空手道模板 即https github com karatelabs karate template https github com karatelabs karate template我能够在 Eclipse IDE 上运行测试
  • 当我在 C++ 中对未初始化的指针调用“delete”时会发生什么?

    假设我声明了一个 char 指针 并在没有调用 new 的情况下调用了它的 delete 这会导致问题吗 char myptr if condition do something involving myptr new char SIZE
  • 教义查询崩溃

    非常非常奇怪 我已经使用这种教义方法数百次了 我有一个简单的控制器 它以 id 作为参数 Doctrine 生成的查询是错误的并且崩溃 Security has role ROLE ADMIN return Response public
  • 是否可以在 SOAP Web 服务中创建只读元素?

    我有一个定义了只读属性的类 在我的代码中 我将其定义为仅具有 getter 的属性 我希望能够通过网络服务来回发送该对象 当我在服务中调用 Get 方法时 它将在服务端填充一个值 定义此属性后 我不希望 Web 服务的使用者能够设置 更改此
  • 什么是了解 ASP.NET 中的 web.config 的好资源?

    我修改 web config 当我HAVE TO 调试设置 会话状态设置等 但在这些情况下 一些教程或错误消息已经明确 打开 web config 并执行 XYZ 我想知道的是 它还能做什么 我现在以其他方式做的事情最好在 web conf
  • 使用NotificationListenerService检查对通知的访问

    我正在使用 gt 4 3NotificationListenerService访问通知 第一次启动时 我的应用程序会将用户带到 访问通知 系统面板 但只要禁用 访问通知 中我的应用程序的复选框 我就想将用户带到那里 我还没有找到isNoti
  • 将带有变量的文本文件导入python

    我的目标 我创建的程序的目的是让用户输入元素的名称 然后 python 读入一个外部文件 找到所请求元素分配的值 最后将该值打印出来 例如 gt gt gt helium 2 问题是我不知道如何让 python 解释如下所示的文本文件 hy
  • 如何生成Maven项目所有模块之间的依赖关系图?

    如何生成 Maven 项目的所有模块之间的依赖关系图 不包括 JUnit SLF4J 等第三方库 我找不到一种使用 m2eclipse 将所有模块包含到一个图中的方法 谢谢 If the 依赖图m2eclipse 的功能不能满足您的需求 也
  • mysql 用以前的值生成缺失的日期

    下面是一个具有稀疏日期的 mysql 表 col dt id value A1 2018 05 28 30 A1 2018 05 30 20 A1 2018 05 31 50 A1 2018 06 01 50 A1 2018 06 04 8