SQL计算车辆越野/上路的总时间
我希望我能做到这一点,第一次发布。下面的查询给出了一段时间内单个车辆的行驶/越野状态SQL计算车辆越野/上路的总时间,sql,Sql,我希望我能做到这一点,第一次发布。下面的查询给出了一段时间内单个车辆的行驶/越野状态 SELECT VASH1.RecordID, VASH1.VehicleAssetID, VASH1.UpdateStatusID, VASH1.UpdateStatusDate FROM dbo.VehicleAssetsStatusHistory VASH1 WHERE VASH1.VehicleAssetID = '45793' ORDER BY VASH1.U
SELECT
VASH1.RecordID,
VASH1.VehicleAssetID,
VASH1.UpdateStatusID,
VASH1.UpdateStatusDate
FROM
dbo.VehicleAssetsStatusHistory VASH1
WHERE
VASH1.VehicleAssetID = '45793'
ORDER BY
VASH1.UpdateStatusDate`
正在返回以下数据集:
Record Vehicle Update Update
ID Asset Status Status
ID ID Date
8720 45793 2 2016-12-21 12:31:51.893
16087 45793 2 2019-02-05 10:57:00.000
16711 45793 2 2019-03-27 14:15:00.000
16717 45793 2 2019-03-28 07:45:00.000
16956 45793 2 2019-04-10 20:00:00.000
17124 45793 2 2019-04-18 11:53:00.000
19592 45793 3 2019-06-06 08:58:00.000
19651 45793 3 2019-06-07 12:00:00.000
21030 45793 2 2019-06-12 15:00:00.000
20702 45793 3 2019-06-28 14:12:00.000
31711 45793 3 2019-07-18 08:27:00.000
43226 45793 2 2019-08-19 07:31:00.000
43274 45793 3 2019-08-19 14:30:00.000
43434 45793 2 2019-08-19 15:00:00.000
43349 45793 3 2019-08-21 09:00:00.000
43500 45793 3 2019-08-27 06:30:00.000
43526 45793 2 2019-08-27 10:00:00.000
43718 45793 2 2019-08-30 14:32:00.000
44214 45793 3 2019-09-11 11:30:00.000
44229 45793 2 2019-09-11 13:23:00.000
44854 45793 3 2019-09-24 12:30:00.000
44942 45793 2 2019-09-25 21:00:00.000
44988 45793 3 2019-09-27 07:00:00.000
45020 45793 2 2019-09-27 13:50:00.000
45496 45793 3 2019-10-08 12:00:00.000
45509 45793 2 2019-10-08 14:04:00.000
更新状态ID 2=公路上,更新状态ID 3=越野。我想计算并返回此车辆离开道路和在道路上的总时间(以分钟为单位),对于每个值,最好使用单独的查询,因为它是更大查询的一部分
最近的一次我是在下面,在这里我计算了一个总的行驶时间,以分钟为单位。我的下一步是将其聚合以得出总数,但它失败了,因为我无法在select和sub selects中使用聚合进行聚合。我当时希望计算出总的越野时间:
SELECT
VASH1.RecordID,
VASH1.VehicleAssetID,
VASH1.UpdateStatusID,
VASH1.UpdateStatusDate,
CASE
--If last UpdateStatusDate (previous to this one) has an UpdateStatusID of 2 then it calculates the time between that last UpdateStatusDate and this one
WHEN (SELECT UpdateStatusID FROM Key2Live.dbo.VehicleAssetsStatusHistory VASH2 WHERE VASH2.VehicleAssetID=VASH1.VehicleAssetID AND VASH2.UpdateStatusDate =
(SELECT MAX(VASH3.UpdateStatusDate) FROM Key2Live.dbo.VehicleAssetsStatusHistory VASH3 WHERE VASH3.VehicleAssetID=VASH1.VehicleAssetID AND VASH3.UpdateStatusDate<VASH1.UpdateStatusDate))=2
THEN DATEDIFF(MINUTE, (SELECT MAX(VASH3.UpdateStatusDate) FROM Key2Live.dbo.VehicleAssetsStatusHistory VASH3 WHERE VASH3.VehicleAssetID=VASH1.VehicleAssetID AND VASH3.UpdateStatusDate<VASH1.UpdateStatusDate), VASH1.UpdateStatusDate)
ELSE 0
END AS 'MinutesOpen'
FROM
Key2Live.dbo.VehicleAssetsStatusHistory VASH1
WHERE
VASH1.VehicleAssetID = '45793'
ORDER BY
VASH1.UpdateStatusDate
Record Vehicle Update Update Minutes
Asset Status Status
ID ID ID Date Open
8720 45793 2 31:51.9 0
16087 45793 2 57:00.0 1117346
16711 45793 2 15:00.0 72198
16717 45793 2 45:00.0 1050
16956 45793 2 00:00.0 19455
17124 45793 2 53:00.0 11033
19592 45793 3 58:00.0 70385
19651 45793 3 00:00.0 0
21030 45793 2 00:00.0 0
20702 45793 3 12:00.0 22992
31711 45793 3 27:00.0 0
43226 45793 2 31:00.0 0
43274 45793 3 30:00.0 419
43434 45793 2 00:00.0 0
43349 45793 3 00:00.0 2520
43500 45793 3 30:00.0 0
43526 45793 2 00:00.0 0
43718 45793 2 32:00.0 4592
44214 45793 3 30:00.0 17098
44229 45793 2 23:00.0 0
44854 45793 3 30:00.0 18667
44942 45793 2 00:00.0 0
44988 45793 3 00:00.0 2040
45020 45793 2 50:00.0 0
45496 45793 3 00:00.0 15730
45509 45793 2 04:00.0 0
在如何用最简单的方法解决这个问题上,我完全偏离了正轨吗
感谢您提供的任何/所有帮助您想要一个有领导的小组吗
Select vehicle, sum(case when
updateStatusId=2
then StatusWiseTimeDiff else
- StatusWiseTimeDiff end) from(
Select vehicle, UpdateStatusID,
Sum(Case when lead(statusid) over
(partition by
vehicle order by updatestatusdate
asc)<>statusid
Then
Date_Diff( Max(UpdateStatusDate),
Min(UpdateStatusDate))) as
StatusWiseTimeDiff from table
End from table
group by vehicle,
)
对于任何感兴趣的人,我找到的解决方案是:
WITH OffRoadDuration as
(
SELECT
VASH1.VehicleAssetID,
VASH1.UpdateStatusID,
DATEDIFF(MINUTE,VASH1.UpdateStatusDate, ISNULL(OA_VASH2.UpdateStatusDate,GETDATE()) ) AS OffRoadMinutes
FROM Key2Live.dbo.VehicleAssetsStatusHistory VASH1
OUTER APPLY
(SELECT TOP 1 * FROM Key2Live.dbo.VehicleAssetsStatusHistory VASH2
WHERE VASH2.VehicleAssetID = VASH1.VehicleAssetID AND VASH2.UpdateStatusDate > VASH1.UpdateStatusDate
ORDER BY VASH2.UpdateStatusDate ASC) AS OA_VASH2
WHERE
VASH1.VehicleAssetID='45793'
)
SELECT
ORD.VehicleAssetID,
ORD.UpdateStatusID,
SUM(ORD.OffRoadMinutes) AS [OffRoadMinutes],
ROUND(CONVERT(FLOAT,SUM(ORD.OffRoadMinutes))/1440,1) AS [OffRoadDays]
FROM
OffRoadDuration ORD
GROUP BY
ORD.VehicleAssetID, ORD.UpdateStatusID
感谢所有的帮助,非常感谢我想你的答案缺少时差是的,你是对的,Ops查询太长了,看不出需要时差。该代码无法解决问题。这意味着什么,请解释一下?上面的查询给出了每个车辆更新时的输出沿时间方向的时差,外部查询给出了道路上和越野的总时差,但问题涉及标准的丘陵和山谷问题-让我解释一下,在上面的示例数据中,只有一辆车,但其状态变化超过10次。您当前的代码将此视为两种情况—您的第一个版本将此视为一种情况。您必须根据每个更改的状态更改找到结束点,然后将这些结果汇总到总值中。这就是问题所在。例如,如果我在路上走了3次,每次10分钟,总共30分钟。您在哪个平台上使用SQL-这会有所不同谢谢您的越轨双关语您是否尝试将打开的分钟数相加并按状态id分组??这可以使用CTE或Temp表,甚至是subquery@Standin.Wolf-这是行不通的-因为这是一个运行总数,它会给出一个有趣的数字,这是为哪个dbms设计的???SQL只是多个dbms使用的一种语言。