计算存储过程中的 SQL 列

Calculated SQL column in stored procedure

我有以下存储过程:

SELECT 
    a.OtherMeasurementID
    , a.MeasurementID
    , b.MeasurementCode
    , a.OperationDate
    , a.OperationTime
    , a.AccumulatedMass 
    , CAST(a.OperationDate AS datetime) + CAST(a.OperationTime as datetime) oDateTime
INTO 
    #_OtherMeasurement
FROM 
    _OtherMeasurement a 
INNER JOIN 
    _Measurement b ON a.MeasurementID = b.MeasurementID
WHERE 
    a.OperationDate >= DATEADD(DAY, -1, @StartDate) 
    AND a.OperationDate <= DATEADD(DAY, 1, @EndDate)
    AND b.MeasurementCode LIKE '%Inlet%'

--============================================
;with CTE as
(
    select 
        T1.OtherMeasurementID
        , t1.MeasurementID
        , T1.MeasurementCode
        , T1.OperationDate
        , T1.OperationTime
        , T1.AccumulatedMass
        , case when T1.AccumulatedMass = 0 then 0 else T1.AccumulatedMass - T2.AccumulatedMass end as ReceivedMass
        , T1.oDateTime
    From 
        #_OtherMeasurement T1
    left join
        #_OtherMeasurement T2 on T1.MeasurementCode = T2.MeasurementCode 
                    and DATEADD(Hour, -1, T1.oDateTime) = T2.oDateTime
    left join 
        #_OtherMeasurement T3 on T1.MeasurementCode = T3.MeasurementCode 
                    and DATEADD(Hour, 1, T1.oDateTime)= T3.oDateTime
)
,CTE2 as
(      
    select 
        T1.OtherMeasurementID
        , T1.MeasurementID
        , T1.MeasurementCode
        , T1.OperationDate
        , T1.OperationTime
        , T1.AccumulatedMass             
        , case when T1.AccumulatedMass = 0 then (T2.ReceivedMass + T3.ReceivedMass)/2 else T1.ReceivedMass end as ReceivedMass        
    From 
        CTE T1
    left join 
        CTE T2 on T1.OperationDate = T2.OperationDate and T1.MeasurementCode = T2.MeasurementCode 
                and DATEADD(Hour, -1, T1.oDateTime)= T2.oDateTime
    left join 
        CTE T3 on T1.OperationDate = T3.OperationDate and T1.MeasurementCode = T3.MeasurementCode 
                and DATEADD(Hour, 1, T1.oDateTime)= T3.oDateTime 
)
select 
    OtherMeasurementID,
    MeasurementID,
    MeasurementCode,
    OperationDate,
    OperationTime,
    AccumulatedMass,
    coalesce(ReceivedMass, 0) ReceivedMass
from 
    CTE2
WHERE
    OperationDate BETWEEN @StartDate AND @EndDate

如果你在 CTE2 上看到,有一行

case when T1.AccumulatedMass = 0 then (T2.ReceivedMass + T3.ReceivedMass)/2 else T1.ReceivedMass end as ReceivedMass

如果同一天累积质量的值为零,则该行将起作用。 table 的数据是按小时计算的。如果零值位于 10/Jan/2015 23:00:00 上,则该行将不起作用。因为下一个值应该是 11/Jan/2015 00:00:00。示例语句是,如果零前后的值在同一日期,则计算有效。如果没有,那就不行了。

我的问题是,即使零之后的下一个值在不同的日期,我怎样才能使公式工作..?

示例:

OtherMeasurementID  MeasurementID   MeasurementCode OperationDate   OperationTime   AccumulatedMass ReceivedMass
17                       1         Water Inlet         13-Oct-2014  17:00:00           236265.36    518.58
18                       1         Water Inlet         13-Oct-2014  18:00:00           236795.95    530.59
19                       1         Water Inlet         13-Oct-2014  19:00:00           0            533.57
20                       1         Water Inlet         13-Oct-2014  20:00:00           237865.13    536.55
21                       1         Water Inlet         13-Oct-2014  21:00:00           238404.14    539.01
22                       1         Water Inlet         13-Oct-2014  22:00:00           238944.05    539.91
23                       1         Water Inlet         13-Oct-2014  23:00:00           0            0
24                       1         Water Inlet         14-Oct-2014  0:00:00            240026       240026
25                       1         Water Inlet         14-Oct-2014  1:00:00            240566.98    540.98
26                       1         Water Inlet         14-Oct-2014  2:00:00            241107.92    540.94

如果你能看到上面的例子。在 13/Oct/2015 19:00,累积质量为零。所以计算接收质量的公式是 (previous receivedmass before zero + next receivedmass after zero) / 2

但是,如果您在 13/Oct/2015 23:00 上看到,上面的公式不起作用,因为 next receivedmass after zero 在另一个日期,即 14/Oct/2015 00:00.

谢谢。

简单更改自:

left join CTE T3 on T1.OperationDate = T3.OperationDate and T1.MeasurementCode = T3.MeasurementCode and DATEADD(Hour, 1, T1.oDateTime)= T3.oDateTime

至:

left join CTE T3 on (T1.OperationDate = T3.OperationDate and T1.MeasurementCode = T3.MeasurementCode and DATEADD(Hour, 1, T1.oDateTime)= T3.oDateTime) or (dateadd(day, 1, T1.OperationDate) = T3.OperationDate and T1.MeasurementCode = T3.MeasurementCode and DATEADD(Hour, 1, T1.oDateTime)= T3.oDateTime)