2017-08-17 60 views
2

之间存在的记录,我目前写了返回查询以下查询创建不2点

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

+0

也许,如果你可以'创建临时TABLES',并建立一个表的所有可能的时间,然后做智能'JOIN'或'UNION'东西有些亲切。但声音难以对我 – RealCheeseLord

回答

2

一个典型的解决方案是定义一个包含所有句点的源表(table),并将查询添加到表中。

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

这不会把前一行的值作为未知时期的状态,虽然 – RealCheeseLord

+1

@RealCheeseLord我更新了答案。如果一段时间缺失,不知道从哪里获得状态 – StanislavL