2016-09-05 10 views
0

タイムスタンプごとに異なる値を示す表があります。値が変更されるたびに(温度計コントローラのような)線がテーブルに挿入されます。クエリ結果を「正規化する」方法

レコードを表示すると、変更とタイムスタンプのみが表示されます。私の問題は、たとえ値が全く変化していなくても1分ごとに結果を表示する必要があることです。テーブルに「空白」行を挿入しないでください。

同じ日付のすべてのgetdate()スタンプが表示されているビューでテーブルに参加しようとしましたが、クエリが機能しなくなりました。

05 Sep 2016 09:50:24 20 
05 Sep 2016 09:56:14 18 

はあなたが再帰CTEを使用する必要が

05 Sep 2016 09:50:24 20 
05 Sep 2016 09:51:24 20 
05 Sep 2016 09:52:24 20 
05 Sep 2016 09:53:24 20 
05 Sep 2016 09:54:24 20 
05 Sep 2016 09:55:24 20 
05 Sep 2016 09:56:14 18 
05 Sep 2016 09:57:24 18 
. 
. 
+2

1つのオプションは、あなたが不足しているデータを埋めるために使用した日付/時刻表を持っているだろう。 –

答えて

2

でなければなりません。私は列がChangedDate日時とSomeValueあなたの質問の第2列の任意の値と呼ばれると仮定します。あなたのサンプルについて

;WITH cte AS (
SELECT t.ChangedDate, 
     t.SomeValue, 
     p.ChangedDate as NextDate 
FROM YourTable t 
OUTER APPLY (
    SELECT top 1 * 
    FROM YourTable 
    WHERE t.ChangedDate <ChangedDate 
    ORDER BY ChangedDate 
    ) p 
UNION ALL 
SELECT DATEADD(minute,1,ChangedDate), 
     SomeValue, 
     NextDate 
FROM cte 
WHERE DATEADD(minute,1,ChangedDate) < NextDate 
) 

SELECT ChangedDate, 
     SomeValue 
FROM cte 
ORDER BY ChangedDate 
OPTION (MAXRECURSION 0) 

それの出力は以下となります。

ChangedDate    SomeValue 
2016-09-05 09:50:24.000 20 
2016-09-05 09:51:24.000 20 
2016-09-05 09:52:24.000 20 
2016-09-05 09:53:24.000 20 
2016-09-05 09:54:24.000 20 
2016-09-05 09:55:24.000 20 
2016-09-05 09:56:14.000 18 

あなたは('2016-09-05 10:00:34', 17)のような1つの以上の文字列を追加する場合は、出力は以下となります。

ChangedDate    SomeValue 
2016-09-05 09:50:24.000 20 
2016-09-05 09:51:24.000 20 
2016-09-05 09:52:24.000 20 
2016-09-05 09:53:24.000 20 
2016-09-05 09:54:24.000 20 
2016-09-05 09:55:24.000 20 
2016-09-05 09:56:14.000 18 
2016-09-05 09:57:14.000 18 
2016-09-05 09:58:14.000 18 
2016-09-05 09:59:14.000 18 
2016-09-05 10:00:14.000 18 
2016-09-05 10:00:34.000 17 

あなたは現在まで続くように、このログが必要な場合時間の変更部分:

p.ChangedDate as NextDate 
この上のCTEで

:ここ

COALESCE(p.ChangedDate,GETDATE()) as NextDate 
関連する問題