我有一个SQLite3表,它具有以下模式:
CREATE TABLE IF NOT EXISTS automationProcessLog (
id integer PRIMARY KEY,
timestamp text NOT NULL, -- expected format yyyy-MM-dd hh:mm:ss.ssssss+ZZ:ZZ
month_day text GENERATED ALWAYS AS (substr(timestamp, 6, 2) || '-' || substr(timestamp, 9, 2)) STORED, -- expected format MM-dd
hour integer GENERATED ALWAYS AS (substr(timestamp, 12, 2)) STORED,
minute integer GENERATED ALWAYS AS (substr(timestamp, 15, 2)) STORED,
weekday text NOT NULL,
sampleID text,
carrierID text,
nodeID text,
IOnode text, -- expected True/False
nodeType string GENERATED ALWAYS AS (substr(nodeID, 1, instr(nodeID, '/')-1)) STORED,
nodeNumberByType integer GENERATED ALWAYS AS (substr(nodeID, instr(nodeID, '/')+1, length(nodeID))) STORED,
processStep text,
data text,
FOREIGN KEY(nodeID) REFERENCES nodes(nodeID)
)
此表包含自动化上节点(nodeID
)之间由托架(carrierID
)运输的样本(sampleID
)的所有事件。托架一次只能运输一个样本。
我想创建一个视图,其中有sampleID
、carrierID
、timestamp
(当样品被引入到自动化系统时)、nodeID
(当样品被引入时)、timestamp
(当样品被处理时)(即除了加载之外的任何东西)、nodeID
(当样品被处理时)以及duration
(从加载到处理)。
- 当行具有
IOnode = "True"
和processStep = "Processed"
时,加载样本 - 一个样品在到达最终目的地之前可能会在多个节点进行处理,有时甚至会在同一个节点重复处理。在这种情况下,
duration
仍然从样品加载到自动化设备上时开始计数。 - 样品在卸载后可以重新引入自动化装置。
duration
将从样品的最后一次加载开始计数。
一些伪逻辑将选择sampleID
、carrierID
、timestamp
(timestamp_processed
)和nodeID
(nodeID_processed
)WHERE NOT (IOnode = "True" AND processStep = "Processed")
,添加timestamp
(timestamp_loaded
)和nodeID
(nodeID_loaded
),对于具有相同sampleID
和carrierID
的行,具有最新的timestamp
,其早于(小于)timestamp_processed
WHERE (IOnode = "True" AND processStep = "Processed")
,并且为此计算时间戳之间的duration
。
我一直在研究LAG
函数以及像this one这样的问题的答案,但我还没有能够产生一些有效的东西。
1条答案
按热度按时间nxagd54h1#
您可以使用子查询或CTE来提取加载时间,使用
lead()
窗口函数也可以获得同一样本的下一次加载时间。然后将其与主表联接以获得相应的处理步骤和持续时间。