无循环SQL获取连续行值:Vertica实现入站消息首次响应时间计算
Vertica 计算入站消息首次响应时间方案
核心思路
无需递归或循环,直接通过带范围限定的分析函数实现匹配:
- 出站(out)类型消息的ReplyDate直接返回null
- 入站(in)类型消息取同AppId下,发送时间晚于当前消息的所有出站消息的最小发送时间,即为最近的首次响应时间,无匹配则返回null
可行SQL代码
SELECT AppId, Id, Direction, Text, Date, CASE WHEN Direction = 'out' THEN NULL ELSE MIN(CASE WHEN Direction = 'out' THEN Date END) OVER ( PARTITION BY AppId ORDER BY Date ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) END AS ReplyDate FROM your_table_name -- 替换为实际表名 ORDER BY AppId, Date ASC;
逻辑说明
PARTITION BY AppId限定仅在同一会话范围内匹配响应消息,不会跨会话取值ORDER BY Date按消息发送时间正序排列同会话内的消息ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING限定窗口范围为当前行之后的所有同会话记录,覆盖当前入站消息之后的所有历史消息- 内层CASE仅提取出站消息的发送时间,外层MIN取最小时间即为最近的响应时间,无匹配时MIN自动返回null,完全符合需求规则
注意:如果Date字段存储为字符串格式,需要先转为时间戳类型再参与计算,避免字符串排序出现逻辑错误。
内容的提问来源于stack exchange,提问作者trojan horse
相关产品推荐
相关产品推荐

