我有一个表,记录系统中的每个事件,如'排队','开始','完成','失败'等等......表格中有更多的步骤,但这些都是我感兴趣的。
我只选择了我想要的事件
SELECT [Id]
,[EventTime]
,[Message]
FROM [Log]
WHERE [Message] LIKE '%Queued%'
OR [Message] LIKE '%Started%'
OR [Message] LIKE '%Finished%'
OR [Message] LIKE '%Failed%'
这给了我类似的东西
Id EventTime Message
5764 2013-12-20 17:52:25.037 Queued
5764 2013-12-20 17:53:09.767 Started
5765 2013-12-20 17:55:50.403 Queued
5764 2013-12-20 17:57:07.503 Finished
5765 2013-12-20 17:57:39.010 Started
5765 2013-12-20 17:58:05.553 Failed
我希望从此查询中得到的是以下格式的记录集
Id,QueuedTime,StartTime,FinishedTime,Duration,Status
现在状态列应为'如果只有QueuedTime则排队','如果有开始但没有结束时间则为InProgress',如果有开始和结束时间则为'成功',如果有,则为'失败'失败的时间。
我知道我需要某种类型的Status列的case语句,但我不知道如何以同一行中一个Id的所有内容的格式获取它。
任何人都可以就如何实现这一目标提供一些帮助吗?
答案 0 :(得分:0)
您有一个缺失变量,用于将所有这些日志分组到一个会话中。
在您的查询中,它们可能是状态为“已启动”的多个日志,因此您需要有一个“requestId”或类似的内容,每个类型包含1个日志。
答案 1 :(得分:0)
试试这个
SELECT ID,MIN(EventTime),MAX(EventTime),TIMEDIFF(MAX(EventTime),MIN(EventTime)) * 24*60*60 AS DURATION,Message
FROM TABLE1
GROUP BY ID
答案 2 :(得分:0)
也许是这样的:(抱歉,我只知道Oracle SQL,时间格式可能有误,但这是我的基本想法:))
SELECT (
SELECT min (to_timestamp(EventTime|| ' ' || substr(Message,0,12),'YYYY-MM-DD HH24:MI:SS.FF3'))
- max (to_timestamp(EventTime|| ' ' || substr(Message,0,12),'YYYY-MM-DD HH24:MI:SS.FF3'))
FORM log q
WHERE q.id = b.id
AND Message like '%Queued%'
) AS QueuedTime
FROM log b
答案 3 :(得分:0)
您可以通过多个LEFT OUTER JOIN实现此目的,但请注意,如果您拥有大量数据,性能可能会很差。从性能角度来看,使用LIKE查询消息列并不是一个好主意。
您是否考虑过使用某种ETL工具在将数据加载到数据库之前准备数据(假设它来自外部源)?
无论如何,这是你可以做的:
select
q.id,
q.eventtime as QueuedTime,
s.eventtime as StartTime,
f.eventtime as FinishTime,
f.eventtime-s.eventtime as Duration,
case
when fail.id is not null then 'Failed'
when (q.eventtime is not null and s.eventtime is null and f.eventtime is null) then 'Queued'
when (q.eventtime is not null and s.eventtime is not null and f.eventtime is null) then 'InProgress'
when (q.eventtime is not null and s.eventtime is not null and f.eventtime is not null) then 'Success'
end as Status
from
(
select
distinct id,
eventtime
from
log
where
message like '%Queued%'
) q
left outer join
(
select
distinct id,
eventtime
from
log
where
message like '%Started%'
) s
on
q.id = s.id
left outer join
(
select
distinct id,
eventtime
from
log
where
message like '%Finished%'
) f
on
q.id = f.id
left outer join
(
select
distinct id,
eventtime
from
log
where
message like '%Failed%'
) fail
on
q.id = fail.id