查询以创建2点之间不存在的记录

时间:2017-08-17 07:50:23

标签: mysql sql

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

+-----------+--------+--------+
| 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   |
+-----------+--------+--------+

请注意,我确实存在多个客户端ID,我的目的只是完成我在数据中为该Client_Id提供的最短和最长期间之间的任何空白。 此外,每个客户的期间因客户而异。例如,客户端1可以具有最大周期6,客户端2可以具有最大周期8。

有没有人知道可以这样做的方法?

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

1 个答案:

答案 0 :(得分:2)

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

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