首页 > 解决方案 > SQL - 向 SELECT 添加条件

问题描述

我有一个表,其中包含机器的时间戳和 inCycle 状态。我正在使用两个 CTE 并对行号进行 INNER JOIN,因此我可以轻松地将一行的时间戳与下一行的时间戳进行比较。我有 DATEDIFF 工作,现在我需要查看 inCycle 状态。基本上,如果 inCycleThis 和 inCycleNext 都 = 1,我需要将它添加到 InCycle 总数中。

同样(显示的表格将清楚地说明这一点):

incycleThis/next = 0,1 = not in cycle
incycleThis/next = 0,0 = not in cycle
incycleThis/next = 1,1 = in cycle

如果我在做这个客户端,这将非常简单。由于有很多记录,我需要在存储过程中执行此操作。我很想在 SELECT 部分使用“IF”,但它似乎不是这样工作的。

我最终要寻找的结果很简单: InCycle = Xtime. 就像是:

SUM(Diff_seconds if((InCycleThis = 1 AND InCycleNext = 1) OR (InCycleThis = 1 AND InCycleNext = 0))

这是我到目前为止所拥有的:

WITH History_CTE (DT, MID, FRO, IC, RowNum)
AS
(
SELECT DateAndTime
    ,MachineID
    ,FeedRateOverride
    ,InCycle
    ,ROW_NUMBER()OVER(ORDER BY MachineID, DateAndTime) AS "row number"
FROM History
WHERE DateAndTime >= '2020-11-15'
    AND DateAndTime < '2020-11-16'
),

History2_CTE (DT2, MID2, FRO2, IC2, RowNum2)
AS
(
SELECT DateAndTime
    ,MachineID
    ,FeedRateOverride
    ,InCycle
    ,ROW_NUMBER()OVER(ORDER BY MachineID, DateAndTime) AS "row number"
FROM History
WHERE DateAndTime >= '2020-11-15'
    AND DateAndTime < '2020-11-16'
)
SELECT DT as 'TimeStamp'
,DT2 as 'TimeStamp Next Row'
,MID
,FRO
,IC as 'InCycle this'
,IC2 as 'InCycle next'
,RowNum
,DATEDIFF(s, History2_CTE.DT2, History_CTE.DT) AS 'Diff_seconds'
FROM History_CTE
INNER JOIN
    History2_CTE ON History_CTE.RowNum = History2_CTE.RowNum2 + 1

运行时的结果

标签: sqlsql-servercommon-table-expressiongaps-and-islands

解决方案


我最终要寻找的结果很简单: InCycle = Xtime. 就像是:

SUM(Diff_seconds if((InCycleThis = 1 AND InCycleNext = 1) OR (InCycleThis = 1 AND InCycleNext = 0))

据我了解您的问题,您只需将“循环中”行的时间戳与下一行的时间戳之间的差异相加即可。

select machineid, 
    sum(datediff(s, dateandtime, lead_dateandtime)) as total_in_time
from (
    select h.*, 
        lead(dateandtime) over(partition by machineid order by dateandtime) as lead_dateandtime
    from history h
) h
where inclycle = 1
group by machineid

推荐阅读