2016-10-18 6 views
1

複数のテーブルを結合してクエリを作成し、同じ識別子の2行の間に時間差があるかどうかを調べました。SQL Serverで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 

をよりよく説明するために追加した追加の列であり、識別子は、ノードIDとボリュームIDです。

識別子が一致する場合は、最新のタイムスタンプを持つレコードとその前のレコードを比較して差異を判断する必要があります。

上記の例では、クエリは、NODEID 2245及びボリュームID 6545の行番号1と2のみと一致することができる必要があり、出力はNODEID 2245及びボリュームID 7710、行番号7及び8のために、同様に15分

なければならないはず計算に使用する。

どうすればいいですか?私は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, Level 16, State 1, Line 10
Invalid column name 'rn'.
Msg 207, Level 16, State 1, Line 10
Invalid column name 'rn'.

答えて

0

は、以下を使用しますスクリプト。

;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 

サンプル出力:

enter image description here

あなたはすべての行を表示するが、最初の2行分の時間差を必要とし、以下のような余分なケース文を追加したい場合スクリプト。

;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 

サンプル出力:

enter image description here

0

あなたが代わりにメインテーブルのクエリで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 + 1 
関連する問題