2016-05-13 3 views
0

データベース内の2つのテーブルからデータを再構築しようとしています。最初のテーブル(データ)には時間値とコードが含まれています。 2番目のテーブル(信号)には、コードと説明が含まれています。理想的には、timestampで列をグループ化し、行名を記述子テキストに変更した結果表を以下に示します。2つのテーブルからデータを再構築し、テーブルデータから行の名前を変更する

私はグループ化と複数の転置を使用してこの投稿SQLクエリを処理しましたが、これはうまく拡張できません。

これらの機能はすべてSQLクエリ内で実行できますか?

データテーブル

TIMESTAMP   CODE  VALUE 
2016-05-11 13:56:47 1000.ME  26.900 
2016-05-11 13:56:47 1313.ME  9.1136 
2016-05-11 13:56:51 1313.ME  9.1233 
2016-05-11 13:56:56 1313.ME  9.1136 
2016-05-11 13:57:00 1000.ME  27 
2016-05-11 13:57:00 1313.ME  9.1331 

シグナル表

CODE  DESCRIPTOR 
1000.ME Inlet Thermpcouple 
1313.ME Air Flow 

結果表

Timestamp    Inlet Thermpcouple Air Flow 
2016-05-11 13:56:47 26.900    9.1136 
2016-05-11 13:56:51 26.900    9.1233 
2016-05-11 13:56:56 26.900    9.1136 
2016-05-11 13:57:00 27     9.1331 
+0

希望する出力では、2行目と3行目はなぜ26.900ですか?そのタイムスタンプの場合、Inlet Thermpcoupleには値がありません。したがって、26.900ではなく、27またはnullを選択できますか? – Aleksej

+0

シグナルテーブルの行を使用して、結果セット内のカラムをプレーンSQLで決定することは、動的に行うことはできません。 (とにかくXMLで出力しない限り)。固定値を使用すると、そのデータを簡単に取得できますが、動的値は取得できません。 –

+0

@AlexPoole - ハ、私はそれを言いました、私は私の記事を編集しなければならなかったことを嬉しく思います。:-) – mathguy

答えて

1

グッドプラクティスは、あなたの質問を投稿してくれてありがとう!

これは、必要な操作を行うための方法の1つです。問題には3つの部分があります。まず、コードの代わりに実際の記述子を持つように、2つのテーブルを結合する必要があります。次に、入口熱電対と気流の読みが2つの列に分かれるようにピボットする必要があります。第3に、1つのタイムスタンプでAir Flowの値のみを持ち、Inlet Thermocoupleの値がない場合は、IT値を最新の読み値(値)で埋める必要があります。

結合は簡単で、3番目の部分は、LAG()関数のIGNORE NULLSオプションを直接適用したものです。この関数はwindowing節を許可します;デフォルトはrows between unbounded preceding and current rowです。これは私たちが必要とするものなので、このパラメータは使用しませんでした。デフォルトは完璧です)

唯一の欠点は、 SQLの場合は、SQL文で使用するすべてのテーブルの列の数と名前を認識する必要があります。したがって、あなたのテーブルに "Inlet Thermocouple"と "Air Flow"を記述子として持たせるのは役に立ちません。彼らはまだのコードでにハードコードされています。したがって、あなたはそれでOKです。この方法でクエリを記述することも、動的SQLコードを開発する必要があります。

以下は、テストデータを含むコードとクエリからの出力です。

with data_table (ts, code, val) as (
     select to_timestamp('2016-05-11 13:56:47', 'yyyy-mm-dd hh24:mi:ss'), 
                '1000.ME', 26.9  from dual union all 
     select to_timestamp('2016-05-11 13:56:47', 'yyyy-mm-dd hh24:mi:ss'), 
                '1313.ME', 9.1136 from dual union all 
     select to_timestamp('2016-05-11 13:56:51', 'yyyy-mm-dd hh24:mi:ss'), 
                '1313.ME', 9.1233 from dual union all 
     select to_timestamp('2016-05-11 13:56:56', 'yyyy-mm-dd hh24:mi:ss'), 
                '1313.ME', 9.1136 from dual union all 
     select to_timestamp('2016-05-11 13:57:00', 'yyyy-mm-dd hh24:mi:ss'), 
                '1000.ME', 27  from dual union all 
     select to_timestamp('2016-05-11 13:57:00', 'yyyy-mm-dd hh24:mi:ss'), 
                '1313.ME', 9.1331 from dual 
    ), 
    signals_table (code, descriptor) as (
     select '1000.ME', 'Inflow Thermocouple' from dual union all 
     select '1313.ME', 'Air Flow'   from dual 
    ), 
    j as (
     select d.ts, s.descriptor, d.val from data_table d 
            inner join signals_table s on d.code = s.code 
    ), 
    p as (
     select * from j 
      pivot (min(val) for descriptor in ('Inflow Thermocouple' as it, 
               'Air Flow' as af)) 
    ) 
select ts, last_value(it ignore nulls) over (order by ts) as "Inflow Thermocouple", 
      last_value(af ignore nulls) over (order by ts) as "Air Flow" 
from p 
order by ts; 

注 - 以下の出力は、実際のタイムスタンプデータ型を示しています。私はあなたの "タイムスタンプ"の列が実際にDATEデータ型か真のタイムスタンプであるかどうかはわかりませんでした。また、Oracleのキーワード(「タイムスタンプ」や「日付」など)をデータベースの表または列名として使用することは、一般的には非常に悪い考えです。私はそれをTSに変更しました。

TS           Inflow Thermocouple Air Flow 
--------------------------------------------- ------------------- ---------- 
11-MAY-16 01.56.47.000000000         26.9  9.1136 
11-MAY-16 01.56.51.000000000         26.9  9.1233 
11-MAY-16 01.56.56.000000000         26.9  9.1136 
11-MAY-16 01.57.00.000000000         27  9.1331 
+0

ええ、私は投稿しないことにしました。とにかく値をハードコーディングしているので、シグナルテーブルはデータテーブルから直接ピボットで行うことができるので、シグナルテーブルは無関係です。さて、私は固定コードを仮定していると思いますが、あなたはちょうど固定された記述子を仮定しています。これは少し柔軟です。シグナルテーブルに新しい行を追加するには、まだ一致するようにクエリを修正する必要があります。 –

+0

右 - たとえば、Air Flow測定値に複数のコードが割り当てられている可能性があると仮定します。より多くの記述子がある場合にのみ、クエリを修正する必要があります。 Inflow ThermocoupleまたはAir Flowのいずれかに異なる(新しい)コードを割り当てる行がさらにある場合、クエリは変更する必要はありません。 – mathguy

+0

十分に適切であり、記述子を使用することで、クエリの重要な部分が明確になります。私はまだOPが動的な答えを望んでいると思うが、これは普通のSQLで得ることができるほど近いかもしれない。 –

関連する問題