SQL按日期将多条记录合并为1行

时间:2019-04-08 16:46:19

标签: sql-server tsql

我想找到日志表中连续(根据日期字段)记录之间的时间间隔...

例如,

enter image description here

这些是我每天运行的进程的日志记录。我想制作一个包含各个字段的报告,例如开始和结束日期,经过的分钟数等,但是为了简化问题的“核心”,我想我需要弄清楚如何获取这些开始和结束记录(标记为注释字段)插入一行,该行代表流程运行的1次运行。我尝试了数据透视表,但由于无法在数据透视表中使用“按日期排序”,因此我无法使其正常工作,我认为这是使“最大”聚合有用的必要条件。我试过分组...我几乎可以使用“ Row_Number()”将其与自联接一起工作,并将Row_Number()与RowNumber + 1联接起来(因为与上次开始相比,每个开始时间相距1行)。 )

但是后来我发现了一些不是这样的记录。我想这个基本任务已经完成了很多次,但是我还没有找到解决方案。

如何简单地执行每个流程(由“开始”和大概的“结束”日期定义)并将它们合并为一行,以便进行进一步的汇总?

1 个答案:

答案 0 :(得分:0)

如果“下一条”记录始终是结束记录,则可以执行以下操作:

select t.*
from (select t.*,
             lead(log_date) over (order by log_date) as end_log_date
      from t
     ) t
where comment = 'Start tf_crediting : FULL';

如果您想要下一个结束日期,则可以使用累积的条件最小值:

select t.*
from (select t.*,
             min(case when comment = 'end Crediting' then log_date end) over (order by log_date desc) as end_log_date
      from t
     ) t
where comment = 'Start tf_crediting : FULL';