グッドプラクティスは、あなたの質問を投稿してくれてありがとう!
これは、必要な操作を行うための方法の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
希望する出力では、2行目と3行目はなぜ26.900ですか?そのタイムスタンプの場合、Inlet Thermpcoupleには値がありません。したがって、26.900ではなく、27またはnullを選択できますか? – Aleksej
シグナルテーブルの行を使用して、結果セット内のカラムをプレーンSQLで決定することは、動的に行うことはできません。 (とにかくXMLで出力しない限り)。固定値を使用すると、そのデータを簡単に取得できますが、動的値は取得できません。 –
@AlexPoole - ハ、私はそれを言いました、私は私の記事を編集しなければならなかったことを嬉しく思います。:-) – mathguy