【发布时间】:2020-12-21 20:30:12
【问题描述】:
我有一个表,其中包含机器的时间戳和 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
【问题讨论】:
-
尝试在 WHERE 中使用 CASE 条件。 stackoverflow.com/questions/13858239/…
-
请发布想要的结果。如果使用
SUM,您要根据哪些组进行聚合? -
感谢 Mihal 的链接,如果我知道如何引用结果,我想我可以让 CASE 工作。我想我会添加一个新的 SELECT SUM('Diff_seconds') AS 'EarnedValue' FROM History_CTE - 但它不喜欢那样。如何参考之前的结果?
-
@Parfait - 从 InCyleThis = 1 AND InCycleNext = 1 OR InCycleThis = 1 AND InCyleNext = 0 的行中求和 Diff_seconds
-
除非我遗漏了什么,否则您的前两个 CTE 完全相同。您不需要其中的两个 - 只需将 History_CTE 自行加入即可。通过使用
DATEDIFF(s,而不是DATEDIFF(second,,你真的有什么收获吗?哪个更具可读性?
标签: sql sql-server common-table-expression gaps-and-islands