SQL筛选唯一事件和日期时间

时间:2015-01-28 08:38:10

标签: sql-server

之前我确实问了这个问题,但删了帖子。

这是我的问题:我在SQL Server中有一个表,表中有多个事件,我试图过滤事件和某个X分钟事件之间的日期时间。

我需要有关T-SQL查询的帮助。

可以使用什么来做以下(任何链接将不胜感激): 获取设备的event_id和日期时间,与其他event_id的列表进行比较,以查看该设备的最后24分钟是否还有其他事件。

什么对我有用?嵌套查询? Where子句? CTE?

我尝试了6次查询但没有得到我需要的结果,是否使用(max)datetime然后在event_ID上进行比较?

我知道这并不多,但任何帮助或链接都会受到赞赏....

请求(完整查询无更改) 1.

SELECT A.[Unit_id]
      ,A.[TransDate]
      ,A.[event_id]
      ,A.[event_msg]
      ,B.[TransDate]
      ,B.[event_id]
      ,B.[event_msg]
FROM
(Select
       A.[Unit_id]
      ,MAX(A.[TransDate]) AS Transdate
      ,A.[event_id]
      ,A.[event_msg]
  FROM [JammingEvents].[dbo].[EventLogExtended] AS A
  WHERE event_id = '345'
  GROUP BY A.[Unit_id]
      ,A.[event_id]
      ,A.[event_msg]
  ) AS A
  INNER JOIN
  (SELECT 
       B.[Unit_id]
      ,MAX(B.[TransDate]) AS Transdate
      ,B.[event_id]
      ,B.[event_msg]
  FROM [JammingEvents].[dbo].[EventLogExtended] AS B
  WHERE B.event_id = '985'
  GROUP BY B.[Unit_id]
      ,B.[event_id]
      ,B.[event_msg]
  ) AS B
  ON
  A.Unit_id = B.Unit_id

  WHERE (B.TransDate BETWEEN DATEADD(MINUTE,-24,A.Transdate) AND DATEADD(MINUTE,24,A.Transdate))

这有效但只有你比较2个事件ID。问题是我需要大规模地做这件事。

2

SET NOCOUNT ON
GO

SELECT MAX(ELE.Transdate) AS Transdate
      ,ELE.[Unit_id]
      ,ELE.[event_id]
      ,ELE.[event_msg]
      ,ELE.[Latitude]
      ,ELE.[Longitude]
      ,ELE.[date_ack]
      ,ELE.[user_id_ack]
      ,ELE.[date_closed]
      ,ELE.[user_id_closed]
      ,ELE.[action]
      ,ELE.[EventSeqNo]
      ,ELE.[MsgSeqNo]
      ,ELE.[Speed]
      ,ELE.[Heading]
      ,ELE.[Status1]
      ,ELE.[Status2]
      ,ELE.[GeoLocation]
      ,ELE.[Reg_No]
      ,ELE.[Company]
      ,ELE.[Fleet_Code]
      ,ELE.[IgnStatus]
      ,ELE.[comboActioned] 
FROM
[JammingEvents].[dbo].[EventLogExtended] ELE
INNER JOIN
  (
  SELECT 
       F.Transdate      ,F.[Unit_id]      ,F.[event_id]      ,F.[event_msg]      ,F.[Latitude]      ,F.[Longitude]      ,F.[date_ack]      ,F.[user_id_ack]
      ,F.[date_closed]      ,F.[user_id_closed]      ,F.[action]      ,F.[EventSeqNo]      ,F.[MsgSeqNo]      ,F.[Speed]      ,F.[Heading]      ,F.[Status1]
      ,F.[Status2]      ,F.[GeoLocation]      ,F.[Reg_No]      ,F.[Company]      ,F.[Fleet_Code]      ,F.[IgnStatus]      ,F.[comboActioned] 
FROM [JammingEvents].[dbo].[EventLogExtended] AS F 
WHERE 
F.event_id IN
('302'
,'303'
,'304'
,'305'
,'309'
,'340'
,'341'
,'345'
,'962'
,'963'
,'973'
,'974'
,'975'
,'976'
,'985'
,'987'
,'989'
,'C220'
,'C222'
,'C224'
,'C227'
,'C228') 
      ) AS A
      ON
      ELE.Unit_id = A.Unit_id
  INNER JOIN
  (
  SELECT 
       G.Transdate      ,G.[Unit_id]      ,G.[event_id]      ,G.[event_msg]      ,G.[Latitude]      ,G.[Longitude]      ,G.[date_ack]
      ,G.[user_id_ack]      ,G.[date_closed]      ,G.[user_id_closed]      ,G.[action]      ,G.[EventSeqNo]      ,G.[MsgSeqNo]      ,G.[Speed]      ,G.[Heading]
      ,G.[Status1]      ,G.[Status2]      ,G.[GeoLocation]      ,G.[Reg_No]      ,G.[Company]      ,G.[Fleet_Code]      ,G.[IgnStatus]      ,G.[comboActioned]  
FROM [JammingEvents].[dbo].[EventLogExtended] AS G 
WHERE 
G.event_id = '345'
      ) AS B
  ON
  A.Unit_id = B.Unit_id

  WHERE (ELE.TransDate BETWEEN DATEADD(MINUTE,-24,A.Transdate) AND DATEADD(MINUTE,24,A.Transdate))
  AND
  (ELE.event_id IN
  (
  '302'
,'303'
,'304'
,'305'
,'309'
,'340'
,'341'
,'345'
,'962'
,'963'
,'973'
,'974'
,'975'
,'976'
,'985'
,'987'
,'989'
,'C220'
,'C222'
,'C224'
,'C227'
,'C228'
  ))
  AND
  (ELE.action = '0')
  GROUP BY ELE.TransDate
      ,A.Unit_id
      ,ELE.[Unit_id]
      ,ELE.[event_id]
      ,ELE.[event_msg]
      ,ELE.[Latitude]
      ,ELE.[Longitude]
      ,ELE.[date_ack]
      ,ELE.[user_id_ack]
      ,ELE.[date_closed]
      ,ELE.[user_id_closed]
      ,ELE.[action]
      ,ELE.[EventSeqNo]
      ,ELE.[MsgSeqNo]
      ,ELE.[Speed]
      ,ELE.[Heading]
      ,ELE.[Status1]
      ,ELE.[Status2]
      ,ELE.[GeoLocation]
      ,ELE.[Reg_No]
      ,ELE.[Company]
      ,ELE.[Fleet_Code]
      ,ELE.[IgnStatus]
      ,ELE.[comboActioned] 
  ORDER BY ELE.TransDate, ELE.Unit_id DESC

到目前为止,这让我最接近,但我不知道该怎么做,我对SQL语法和编写查询的能力很差。

2 个答案:

答案 0 :(得分:0)

您可以使用exists子查询要求在前24分钟内同一设备发生另一个事件:

select  *
from    Events e1
where   exists
        (
        select  *
        from    Events e2
        where   e2.Device_ID = e1.Device_ID
                and e2.event_dt between 
                     dateadd(minute, e1.event_dt, -24)
                     and e1.event_dt
        )

答案 1 :(得分:0)

自我加入也应该有效:

SELECT *, DATEDIFF(minute,b.transdate,a.transdate) diff FROM EventLogWxtended a
JOIN eventLogExtended b
ON (a.unit_id=b.unit_id AND b.transdate<a.transdate 
AND DATEDIFF(minute,b.transdate,a.transdate)<24)