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