SQL查询以确定状态?
时间:2020-03-06 14:36:30 来源:igfitidea点击:
我在MSSQL数据库中有一个看起来像这样的表:
Timestamp (datetime) Message (varchar(20))
每天一次,特定进程将在启动时插入当前时间和消息"已启动"。完成后,它会插入当前时间和消息" Finished"。
在给定特定日期的情况下,返回以下内容的是一种好的查询或者一组语句:
- 如果该进程从未开始,则为0
- 如果该过程已开始但尚未完成,则为1
- 2该过程是否已开始和结束
表格中还有其他消息,但是"开始"和"完成"对于此过程是唯一的。
编辑:对于奖励因果报应,如果数据无效,则引发错误,例如,有两个"已开始"消息,或者有一个"已完成"而没有"已开始"的消息。
解决方案
Select Count(Message) As Status
From Process_monitor
Where TimeStamp >= '20080923'
And TimeStamp < '20080924'
And (Message = 'Started' or Message = 'Finished')
我们可以对此稍作修改以检测无效条件,例如多次启动,完成,没有完成的启动等。
Select Case When SumStarted = 0 And SumFinished = 0 Then 'Not Started'
When SumStarted = 1 And SumFinished = 0 Then 'Started'
When SumStarted = 1 And SumFinished = 1 Then 'Finished'
When SumStarted > 1 Then 'Multiple Starts'
When SumFinished > 1 Then 'Multiple Finish'
When SumFinished > 0 And SumStarted = 0 Then 'Finish Without Start'
End As StatusMessage
From (
Select Sum(Case When Message = 'Started' Then 1 Else 0 End) As SumStarted,
Sum(Case When Message = 'Finished' Then 1 Else 0 End) As SumFinished
From Process_monitor
Where TimeStamp >= '20080923'
And TimeStamp < '20080924'
And (Message = 'Started' or Message = 'Finished')
) As AliasName
DECLARE @TargetDate datetime
SET @TargetDate = '2008-01-01'
DECLARE @Messages varchar(max)
SET @Messages = ''
SELECT @Messages = @Messages + '|' + Message
FROM process_monitor
WHERE @TargetDate <= Timestamp and Timestamp < DateAdd(dd, 1, @TargetDate)
and Message in ('Finished', 'Started')
ORDER BY Timestamp desc
SELECT CASE
WHEN @Messages = '|Finished|Started' THEN 2
WHEN @Messages = '|Started' THEN 1
WHEN @Messages = '' THEN 0
ELSE -1
END
select count(*) from process_monitor where timestamp > yesterday and timestamp < tomorrow.
或者,我们可以使用带有最大值的自连接来显示特定日期的最新消息:
select * from process_monitor where timestamp=(select max(timestamp) where timestamp<next_day);
我们缺少唯一标识该过程的列。让我们添加一个称为ProcessID的int列。我们还需要另一个表来标识进程。如果我们依赖原始表,那么我们将永远不会知道从未启动的进程,因为该进程不会有任何行。
select
ProcessID,
ProcessName,
CASE
WHEN
(Select
COUNT(*)
from
ProcessActivity
where
ProcessActivity.processid = Processes.processid
and Message = 'STARTED') = 1
And
(Select
COUNT(*)
from
ProcessActivity
where
ProcessActivity.processid = Processes.processid
and Message = 'FINISHED') = 0
THEN 1
WHEN
(Select
COUNT(*)
from
ProcessActivity
where
ProcessActivity.processid = Processes.processid
and Message = 'STARTED') = 1
And
(Select
COUNT(*)
from
ProcessActivity
where
ProcessActivity.processid = Processes.processid
and Message = 'FINISHED') = 1
THEN 2
ELSE 0
END as Status
From
Processes

