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 用以前的值生成缺失的日期 的相关文章

  • MySQL通过UPDATE/DELETE合并重复数据记录

    我有一个看起来像这样的表 mysql gt SELECT FROM Colors ID USERNAME RED GREEN YELLOW BLUE ORANGE PURPLE 1 joe 1 null 1 null null null 2
  • PDO获取最后插入的ID

    我有一个查询 我想获取插入的最后一个 ID 字段ID是主键并且自动递增 我知道我必须使用这个声明 LAST INSERT ID 该语句适用于如下查询 query INSERT INTO cell place ID VALUES LAST I
  • 从 Presto 中的 JSON 列获取特定值

    我有一个带有 JSON 列的表points其中一行为 0 0 2 1 1 2 2 0 5 15 1 2 20 0 7 我想获取键的值 1 and 20 并将它们存储为别名 例如first and second在查询中 到目前为止我所做的是
  • SQL Server 2008 中的全文搜索一步一步

    如何开始使用SQL Server 2008 中的全文搜索 阅读这些链接 SQL SERVER 2008 创建全文目录和全文搜索 http blog sqlauthority com 2008 09 05 sql server creatin
  • MySQL InnoDB引擎是否对只读事务运行任何性能优化

    根据参考文档 只读事务标志可能会提示存储引擎运行一些优化 设置会话事务只读 如果事务访问模式设置为 READ ONLY 则对表进行更改 被禁止 这可能使存储引擎能够提高性能 不允许写入时可能进行的改进 InnoDB引擎是否对只读事务运行这样
  • PL/SQL 过程:如何返回 select 语句?

    我想创建一个存储过程 on ORACLE数据库服务器我的问题是 我不知道如何返回 select 语句 这是程序中应包含的逻辑 输入参数 过滤器1 int 过滤器2 字符串 with cte as select val1 val2 stdde
  • 当我尝试计算 mysqli 结果时,为什么会收到警告?

    下面的代码会导致此警告 警告 count 参数必须是数组或实现 Countable 的对象 为什么要这样做 如何防止出现警告 if isset GET edit sonum GET edit update true result mysql
  • 如何在postgresql中编写有关最大行数的约束?

    我认为这是一个很常见的问题 我有一张桌子user id INT 和一张桌子photo id BIGINT owner INT 所有者是一个参考user id 我想向表照片添加一个约束 以防止每个用户将超过 10 张照片输入数据库 写这个的最
  • 将自动递增值添加到只有一列的表中

    我需要创建一个基本上仅保留索引列表的表 因此 我创建了一个只有一个名为 id 的自动递增列的表 但是 我似乎无法隐式地将自动递增值添加到该表中 我知道通常当您在表中有这样一列 不仅仅是此列 时 您可以执行以下操作 插入表 col1 col2
  • MySQL 薛定谔表:存在,但不存在

    我遇到了最奇怪的错误 有时 在创建或更改表时 我会收到 表已存在 错误 但是 DROP TABLE 返回 1051 未知表 所以我得到了一个无法创建 无法删除的表 当我尝试删除数据库时 mysql 崩溃了 有时它有助于创建另一个具有不同名称
  • IN 运算符对 SQL 查询性能的影响有多大?

    我的 SQL 查询需要 9 个小时才能执行 见下文 Select Field1 Field2 From A Where Field3 IN 45 unique values here 当我将此查询拆分为 3 个完全相同的查询 仅每个 IN
  • MySQL 组合两个查询

    我有两个 MySQL 查询 QUERY SELECT sodnik 1 FROM prihodnji krog WHERE file id 8778 AND sodnik 1 UNION SELECT sodnik 2 FROM priho
  • PHP-MySQLi 连接随机失败并显示“无法分配请求的地址”

    大约两周以来 我一直在处理 LAMP 堆栈中最奇怪的问题之一 长话短说 与 MySQL 服务器的随机连接失败并显示错误消息 Warning mysqli real connect HY000 2002 Cannot assign reque
  • 如何获取Postgres当前的可用磁盘空间?

    在开始在数据库中进行某些工作之前 我需要确保至少有 1Gb 的可用磁盘空间 我正在寻找这样的东西 select pg get free disk space 是否可以 我在文档中没有找到任何相关内容 PG 9 3 操作系统 Linux Wi
  • value >= all(select v2 ...) 产生与 value = (select max(v2) ...) 不同的结果

    Here https stackoverflow com questions 17026651 query from union of joins 17027784 noredirect 1 comment24611997 17027784
  • 如何选择列值不不同的每一行

    我需要运行一个 select 语句 返回列值不不同的所有行 例如 EmailAddress 例如 如果表格如下所示 CustomerName EmailAddress Aaron email protected cdn cgi l emai
  • Laravel 读写连接不同步

    我在 Laravel 5 2 应用程序中使用读写 MySQL 连接设置 mysql gt write gt host gt env DB HOST WRITE localhost read gt host gt env DB HOST RE
  • 蟒蛇 | MySQL | AttributeError:模块“mysql.connector”没有属性“connect”

    我正在学习 python 中的一个新库 mysql 我尝试执行以下命令 import mysql connector mydb mysql connector connect host localhost user root passwd
  • sql直接获取表行数的方法

    stackoverflow 的朋友们大家好 我的例行程序中有一个我认为不必要的步骤 假设您想从图库中获取所有图像 并限制每页一定数量的图像 db PDO object start pagenum x images per page limi
  • mysql 查询选择当月的所有行?

    我有一个名为 startdate 的日期时间类型的列 我必须获取当前月份的开始日期和结束日期之间的所有行 即从 1 11 2014 到 30 11 2014 select from your table where year curdate

随机推荐

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

    我有一个不可变的类 具有以下布局 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