【问题标题】:Query to create records that don't exist between 2 points查询创建两点之间不存在的记录
【发布时间】:2017-08-17 07:50:22
【问题描述】:

我目前编写了一个返回以下内容的查询

+-----------+--------+--------+
| client_id | Period | Status |
+-----------+--------+--------+
|      2378 |      1 | Paid   |
|      2378 |      2 | Paid   |
|      2378 |      4 | Paid   |
|      2378 |      5 | Paid   |
|      2378 |      6 | Frozen |
|      2378 |     10 | Paid   |
+-----------+--------+--------+

但是,我希望它包括我没有任何数据的时期。 例如,第 3 期和第 7-9 期。通过填写上一时期发生的事情。 例如,第 3 期将变为已付款。像这样:

+-----------+--------+--------+
| client_id | Period | Status |
+-----------+--------+--------+
|      2378 |      1 | Paid   |
|      2378 |      2 | Paid   |
|      2378 |      3 | Paid   |
|      2378 |      4 | Paid   |
|      2378 |      5 | Paid   |
|      2378 |      6 | Frozen |
|      2378 |      7 | Frozen |
|      2378 |      8 | Frozen |
|      2378 |      9 | Frozen |
|      2378 |     10 | Paid   |
+-----------+--------+--------+

请注意,我确实有超过 1 个客户 ID,我的目的只是填写我在数据中为该 Client_Id 提供的最小和最大期间之间的任何空白。 此外,每个客户的时间段也因客户而异。例如,客户端 1 的最大周期为 6,客户端 2 的最大周期为 8。

有谁知道可以做到这一点的方法吗?

我遇到了以下稍微相似的问题,除了我的情况我觉得我需要在不同的 client_id 上编写一个循环? Example I found

【问题讨论】:

  • 也许你可以CREATE TEMP TABLES 并建立一个包含所有可能周期的表格,然后做一些聪明的JOINUNION 的东西。但对我来说听起来很难

标签: mysql sql


【解决方案1】:

一个典型的解决方案是定义一个包含所有句点的源(表),然后将您的查询左连接到表中。

select
   ap.Period,
   case when q.Status is not null then q.Status else @prevStatus end as status,
   @prevStatus:=q.Status
from all_periods ap 
     left join (your query here) q on ap.Period = q.Period,
     (select @prevStatus:='undefined') sess

【讨论】:

  • 这不会将前一行的值作为未知时期的状态,但是
  • @RealCheeseLord 我更新了答案。如果缺少 1 个期间,不知道从哪里获得状态
猜你喜欢
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多