我编写了一个查询,连接多个表,并寻找帮助查找2行相同标识符之间的时间差。
示例:Row num是我添加的另一列,以更好地解释
Row num NodeID Caption VolumeID Caption DateTime
1. 2245 SERVERNAME 6545 D:\RAID 10/10/16 10:25 PM
2. 2245 SERVERNAME 6545 D:\RAID 10/10/16 10:10 PM
3. 2245 SERVERNAME 6545 D:\RAID 10/10/16 9:55 PM
4. 2245 SERVERNAME 6545 D:\RAID 10/10/16 9:40 PM
5. 2245 SERVERNAME 6545 D:\RAID 10/10/16 9:25 PM
6. 2245 SERVERNAME 6545 D:\RAID 10/10/16 9:25 PM
7. 2245 SERVERNAME 7710 D:\AFS\G 10/10/16 10:25 PM
8. 2245 SERVERNAME 7710 D:\AFS\G 10/10/16 10:10 PM
9. 2245 SERVERNAME 7710 D:\AFS\G 10/10/16 9:55 PM
10. 2245 SERVERNAME 7710 D:\AFS\G 10/10/16 9:40 PM
11. 2245 SERVERNAME 7710 D:\AFS\G 10/10/16 9:25 PM
12. 2245 SERVERNAME 7711 D:\AFS\G 10/10/16 10:25 PM
13. 2245 SERVERNAME 7711 D:\AFS\G 10/10/16 10:10 PM
14. 2245 SERVERNAME 7711 D:\AFS\G 10/10/16 9:55 PM
15. 2245 SERVERNAME 7711 D:\AFS\G 10/10/16 9:40 PM
16. 2245 SERVERNAME 7711 D:\AFS\G 10/10/16 9:25 PM
17. 2245 SERVERNAME 7712 D:\AFS\C 10/10/16 10:25 PM
18. 2245 SERVERNAME 7712 D:\AFS\C 10/10/16 10:10 PM
19. 2245 SERVERNAME 7712 D:\AFS\C 10/10/16 9:55 PM
20. 2245 SERVERNAME 7712 D:\AFS\C 10/10/16 9:40 PM
21. 2245 SERVERNAME 7712 D:\AFS\C 10/10/16 9:25 PM
22. 2245 SERVERNAME 7713 D:\AFS\C 10/10/16 10:25 PM
23. 2245 SERVERNAME 7713 D:\AFS\C 10/10/16 10:10 PM
24. 2245 SERVERNAME 7713 D:\AFS\C 10/10/16 9:55 PM
25. 2245 SERVERNAME 7713 D:\AFS\C 10/10/16 9:25 PM
26. 2245 SERVERNAME 7713 D:\AFS\C 10/10/16 9:40 PM在上面的数据示例中,标识符是Nodeid和volumeid。
无论何时标识符匹配,都应该比较具有最新时间戳的记录和之前的记录,以确定差异。
在上面的示例中,查询应该能够只匹配nodeid 2245和volumeid 6545的第1行和第2行,输出应该是15分钟。
同样,对于nodeid 2245和volumeid 7710,应使用第7行和第8行进行计算。
我该怎么做?我尝试使用与CTE表达式,但无法做到。我也尝试了子查询,但失败了。
有人能帮我写这个查询吗。
我试过的查询:
WITH rows AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY [Operations-Orion].[dbo].[VolumeUsage].Datetime) AS rn
FROM [Operations-Orion].[dbo].[VolumeUsage]
)
SELECT DATEDIFF(second, mc.DateTime, mp.Datetime)
FROM [Operations-Orion].[dbo].[VolumeUsage] mc
JOIN [Operations-Orion].[dbo].[VolumeUsage] mp
ON mc.rn = mp.rn这会引发一个错误:
Msg 207,第16级,状态1,第10行 无效列名'rn‘。 Msg 207,第16级,状态1,第10行 无效列名'rn‘。
发布于 2016-10-18 05:44:07
使用下面的脚本。
;WITH cte_1
as
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY NodeID,VolumeID ORDER BY [Datetime] desc) AS rn
FROM #t
)
SELECT A.NodeID,A.Caption,A.VolumeID,A.Caption1,A.[DateTime]
,CASE DATEDIFF(HOUR, B.[DateTime], A.[DateTime])
WHEN 0 THEN CAST(DATEDIFF(MINUTE, B.[DateTime], A.[DateTime]) AS VARCHAR(10))
ELSE CAST(60 - DATEPART(MINUTE, B.[DateTime]) AS VARCHAR(10)) +
REPLICATE(',60', DATEDIFF(HOUR, B.[DateTime], A.[DateTime]) - 1) +
+ ',' + CAST(DATEPART(MINUTE, A.[DateTime]) AS VARCHAR(10))
END TimeDifference
FROM cte_1 A
join cte_1 B
on A.rn=b.rn-1
AND A.NodeID=B.NodeID AND A.VolumeID=B.VolumeID
WHERE B.rn=2 --if you dont want to limit ,comment this line示例输出:

如果希望显示所有行,但只需要前两行的时间差,则添加一个额外的case语句,如下所示。
;WITH cte_1
as
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY NodeID,VolumeID ORDER BY [Datetime] desc) AS rn
FROM #t
)
SELECT A.NodeID,A.Caption,A.VolumeID,A.Caption1,A.[DateTime]
,CASE WHEN b.rn=2 THEN CASE DATEDIFF(HOUR, B.[DateTime], A.[DateTime])
WHEN 0 THEN CAST(DATEDIFF(MINUTE, B.[DateTime], A.[DateTime]) AS VARCHAR(10))
ELSE CAST(60 - DATEPART(MINUTE, B.[DateTime]) AS VARCHAR(10)) +
REPLICATE(',60', DATEDIFF(HOUR, B.[DateTime], A.[DateTime]) - 1) +
+ ',' + CAST(DATEPART(MINUTE, A.[DateTime]) AS VARCHAR(10))
END ELSE NULL END TimeDifference
FROM cte_1 A
join cte_1 B
on A.rn=b.rn-1
AND A.NodeID=B.NodeID AND A.VolumeID=B.VolumeID示例输出:

发布于 2016-10-18 05:32:10
您必须在查询中使用cte而不是主表:
WITH CTEViewName AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY [Operations-Orion].[dbo].[VolumeUsage].Datetime) AS rn
FROM [Operations-Orion].[dbo].[VolumeUsage]
)
SELECT DATEDIFF(second, mc.DateTime, mp.Datetime)
FROM CTEViewName mc
JOIN CTEViewName mp
ON mc.rn = mp.rn + 1https://stackoverflow.com/questions/40099761
复制相似问题