如果一天的运行速度> 0,则其状态为真。
如果某一天没有数据,则推断记录的最后状态代码(
表中的另一列)值,如果该值为零,则将运行状态标记为真。对于非零标记状态为假的代码。
见下表
Day Run speed Statuscode Status
---------------------------------------
1-Jan-14 55 0 TRUE
2-Jan-14 60 0 TRUE
3-Jan-14 58 0 TRUE
4-Jan-14 61 0 TRUE
5-Jan-14 57 0 TRUE
6-Jan-14 56 0 TRUE
7-Jan-14 60 0 TRUE
8-Jan-14 TRUE
9-Jan-14 TRUE
10-Jan-14 55 0 TRUE
11-Jan-14 56 0 TRUE
12-Jan-14 60 0 TRUE
13-Jan-14 0 20 FALSE
(例如 8-jan-14/9-jan-14 没有价值,但由于上次记录的是第 7 天,这就是为什么这两个日期的状态也是如此的原因)
使用OUTER APPLY
更灵活的滞后
现场测试:http : //sqlfiddle.com/#!18/4c73f/18
select
o.*,
Status =
convert(bit,
case
when o.RunningSpeed > 0
or o.RunningSpeed is null and prev.StatusCode = 0 then
1
else
0
end)
from tbl o
outer apply
(
select top 1 StatusCode
from tbl i
where i.Day < o.Day and i.StatusCode is not null
order by i.Day desc
) prev
输出:
| Day | RunningSpeed | Statuscode | Status |
|----------------------|--------------|------------|--------|
| 2014-01-01T00:00:00Z | 55 | 0 | true |
| 2014-01-02T00:00:00Z | 60 | 0 | true |
| 2014-01-03T00:00:00Z | 58 | 0 | true |
| 2014-01-04T00:00:00Z | 61 | 0 | true |
| 2014-01-05T00:00:00Z | 57 | 0 | true |
| 2014-01-06T00:00:00Z | 56 | 0 | true |
| 2014-01-07T00:00:00Z | 60 | 0 | true |
| 2014-01-08T00:00:00Z | (null) | (null) | true |
| 2014-01-09T00:00:00Z | (null) | (null) | true |
| 2014-01-10T00:00:00Z | 55 | 0 | true |
| 2014-01-11T00:00:00Z | 56 | 0 | true |
| 2014-01-12T00:00:00Z | 60 | 0 | true |
| 2014-01-13T00:00:00Z | 0 | 20 | false |
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句