Sql server 限制每列值的sql结果

Sql server 限制每列值的sql结果,sql-server,union,Sql Server,Union,我正在尝试为游标构建select语句 我的表格中有车辆事件,对于我的光标,我将在确定的时间段内获取所有点火开关打开和关闭事件 我想通过union将该时间段内每辆车的第一个和最后一个事件合并到我的select中,我的想法是,该事件的where条款应该是该事件不能打开或关闭点火开关,因此不会重复。但我不知道如何获得每辆车的活动 我目前的情况如下 SELECT al.ActivityLogID, al.[VehicleID], al.[DriverID], al.[

我正在尝试为游标构建select语句

我的表格中有车辆事件,对于我的光标,我将在确定的时间段内获取所有点火开关打开和关闭事件

我想通过union将该时间段内每辆车的第一个和最后一个事件合并到我的select中,我的想法是,该事件的where条款应该是该事件不能打开或关闭点火开关,因此不会重复。但我不知道如何获得每辆车的活动

我目前的情况如下

SELECT  
    al.ActivityLogID,
    al.[VehicleID],
    al.[DriverID],
    al.[ActivityDateTime],
    al.[EventSubTypeId]
FROM    
    [activitylog] a
WHERE   
    [ActivityDateTime] BETWEEN @StartDateTime AND @EndDateTime AND
    [EventSubTypeID] = 3 -- ignitionON

UNION

SELECT  
    al.ActivityLogID,
    al.[VehicleID],
    al.[DriverID],
    al.[ActivityDateTime],
    al.[EventSubTypeId]
FROM    
    [activitylog] a
WHERE   
    [ActivityDateTime] BETWEEN @StartDateTime AND @EndDateTime AND
    [EventSubTypeID] = 4 -- ignitionOFF
ORDER BY 
    [VehicleID], [ActivityDateTime]

假设IgnitionOFF在IgnitionON日期时间之后

SELECT  al.[VehicleID]
      , al.[DriverID]
      , MIN(al.[ActivityDateTime])
      , MAX(al.[ActivityDateTime])
FROM  [activitylog] al
WHERE [ActivityDateTime] BETWEEN @StartDateTime AND @EndDateTime AND
      [EventSubTypeID] IN (3,4) -- ignitionON/OFF
GROUP BY al.[VehicleID]
       , al.[DriverID]
ORDER BY al.[VehicleID]
       , al.[DriverID]
或者你需要这个:

SELECT [VehicleID]
      ,[EventSubTypeID]
      ,[ActivityDateTime]
FROM
(
  SELECT  al.[VehicleID]
        , [EventSubTypeID] 
        , MIN(al.[ActivityDateTime]) AS "ActivityDateTime"
  FROM  [activitylog] al
  WHERE [ActivityDateTime] BETWEEN @StartDateTime AND @EndDateTime AND
        [EventSubTypeID] = 3 -- ignitionON
  GROUP BY al.[VehicleID], [EventSubTypeID]
  UNION
  SELECT  al.[VehicleID]
        , [EventSubTypeID]
        , MAX(al.[ActivityDateTime]) AS "ActivityDateTime" 
  FROM  [activitylog] al
  WHERE [ActivityDateTime] BETWEEN @StartDateTime AND @EndDateTime AND
        [EventSubTypeID] = 4 -- ignitionOFF
  GROUP BY al.[VehicleID], [EventSubTypeID]
)
ORDER BY [VehicleID], [EventSubTypeID]

你为什么用光标?@MitchWheat我在计算驾驶时间。我已经实现了,我的游标中缺少了第一个未签名事件和off。为什么您的表有
a
别名,但
SELECT
中的列列表使用
al.
前缀?!?!?!?如果你计算两个特定时间之间的驾驶时间(你问的问题是“今天每辆车开了多少分钟”),这一切都可以在一个查询中完成。您必须计算每个IgnitionOn和IgnitionOff事件之间的分钟数(或秒数),然后将它们相加。不清楚你到底在问什么?一般规则-如果你需要一个光标,你几乎肯定错了。如果您发布数据和游标查询,您几乎肯定会得到一个不需要游标的答案。当然,千分之一的人确实需要它,这很少见。它只是取代了我已经做的,它没有添加我要查找的内容,不是吗?如果您想要第一个和最后一个事件,请在组中使用MIN()和MAX()函数。您的查询与我要查找的内容很接近,但不完全相同,由于我需要第一个和最后一个事件,并且需要将它们放在不同的行中,所以我通过去掉eventsubtype where子句对其进行了修改。另一方面,我得到的司机组太多,我只需要它每辆车。