1

次のテーブルにデータが含まれています。 ここに画像の説明を入力

データを操作する次の SQL クエリがあり、グラフ API (タイムライン) を使用するために同じ unix_timestamp を使用してすべてのデータをグループ化します。

select * from 
                (
                    select unix_timestamp, date_time, input_raw, tag_id 
                    from [200030].[dbo].inputs
                    WHERE inputs.date_time > dateadd(day,-1,getdate())
                    AND
                    (tag_id = 92084 OR tag_id = 92106 OR tag_id = 92127 OR tag_id = 92149 OR tag_id = 92164 OR tag_id = 92193 OR tag_id = 92215)
                ) src
                pivot
                (
                    max(input_raw)
                    for tag_id in ([92084], [92106], [92127], [92149], [92164], [92193], [92215])
                ) piv
                ORDER by unix_timestamp DESC

そして、これらの結果が得られます (番号付きの列名は、元のテーブルの tag_id フィールドからのものです:

ここに画像の説明を入力

これは素晴らしいことですが、クエリからもう 1 つ必要なことがあります。番号付きの列の下のエントリが最後の非 Null 値になるようにする必要があります。以前の非 Nulls がない場合を除きます。たとえば、列 92149 の下の 4 ~ 8 行目は、Null ではなく 294 にする必要があります。

そしてアドバイス?

ありがとう

4

1 に答える 1

1

問題は、基本的に、一度に1つのタグしか入ってこないため、タイムスタンプに関するデータが「欠落」していることです。1つのアプローチは、不足しているデータを入力することです。

このクエリは、タイムスタンプとタグのすべての組み合わせを取得してから、ピボットの前の最新のinput_raw値を取得します。クエリは、このために相関サブクエリを使用します。

                select unix_timestamp, date_time, tag_id,
                       coalesce(input_raw,
                                (select top 1 input_raw
                                 from inputs i
                                 where i.tag_id = tags.tag_id and
                                       i.unix_timestamp < tags.unix_timestamp
                                 order by unix_timestamp
                                )
                               ) as input_raw
                from (select 92084 as tag_id union all
                      select 92106 union all select 92127 union all select 92149 union all
                      select 92164 union all select 92193 union all select 92215
                     ) tags cross join
                     (select distinct unix_timestamp, datetime, input_raw
                      from [200030].[dbo].inputs
                      WHERE inputs.date_time > dateadd(day,-1,getdate())
                     ) t left outer join
                     [200030].[dbo].inputs i
                     on i.tag_id = tags.tag_id and
                        i.unix_timestamp = tags.unix_timestamp and
                        i.datetime = tags.datetime
                WHERE inputs.date_time > dateadd(day,-1,getdate())

これにより、内部サブクエリが置き換えられます。

于 2013-01-15T21:55:34.407 に答える