次の構造のPostgresテーブルが2つあります。
Table "public.tmp"
Column | Type | Collation | Nullable | Default
-------------------+-------------------------+-----------+----------+---------
MY_SL | character varying(50) | | |
Release | character varying(50) | | |
HOST | character varying(50) | | not null |
UN NO. | character varying(50) | | |
STATUS | character varying(50) | | |
S_DATE | character varying(50) | | not null |
Table "public.mo"
Column | Type | Collation | Nullable | Default
-------------------+-------------------------+-----------+----------+-----------------------------------------
id | integer | | not null | nextval('mbss_output_id_seq'::regclass)
HOST | character varying(50) | | not null |
UN NO. | character varying(50) | | |
STATUS | character varying(50) | | |
S_DATE | character varying(50) | | not null |
compliant_status | character varying(50) | | not null |
以下のように、tmpテーブルにデータがあるとしましょう。
Table: tmp
MY_SL | Release | HOST | UN NO.| STATUS | S_DATE
------------+-------------+-----------+----------------------+------------------
2 | 1 | RhelTest | 7:1:8 | COMPLIANT | 2020-08-26T15:16:48Z
12 | 1 | RhelTest | 7:1:9 | COMPLIANT | 2020-08-26T15:16:48Z
22 | 2 | RhelTest | 7:2:1 | COMPLIANT | 2020-08-26T15:16:48Z
4 | 1 | RhelTest | 7:2:10 | NC | 2020-08-26T15:16:48Z
11 | 2 | RhelTest | 7:2:11 | NC | 2020-08-26T15:16:48Z
1 | 3 | Demo1 | 7:2:11 | NC | 2020-08-26T15:16:48Z
23 | 3 | Demo1 | 7:2:11 | NC | 2020-08-26T15:16:48Z
333 | 3 | Demo2 | 7:2:11 | COMPLIANT | 2020-08-26T15:16:48Z
ここで、public.tmpからpublic.moテーブルにデータをコピーし、以下の条件を実行するpsql INSERTINTOクエリを記述します。
ホストのSTATUS列に混合値がある場合(例:HOST:RhelTestの場合)
最後に、public.moテーブルで期待される出力:
Table: public.mo
id | HOST | UN NO.| STATUS | S_DATE | compliant_status
------------+-------------+-----------+----------------------+------------------
1 | RhelTest | 7:1:8 | COMPLIANT | 2020-08-26T15:16:48Z | PARTIAL
2 | RhelTest | 7:1:9 | COMPLIANT | 2020-08-26T15:16:48Z | PARTIAL
3 | RhelTest | 7:2:1 | COMPLIANT | 2020-08-26T15:16:48Z | PARTIAL
4 | RhelTest | 7:2:10 | NC | 2020-08-26T15:16:48Z | PARTIAL
5 | RhelTest | 7:2:11 | NC | 2020-08-26T15:16:48Z | PARTIAL
6 | Demo1 | 7:2:11 | NC | 2020-08-26T15:16:48Z | NON_COMPLIANT
7 | Demo1 | 7:2:11 | NC | 2020-08-26T15:16:48Z | NON_COMPLIANT
8 | Demo2 | 7:2:11 | COMPLIANT | 2020-08-26T15:16:48Z | COMPLIANT
ウィンドウ関数とcase
式を使用できます。status
データに示されているように、の可能な値が2つしかない場合、これを行う1つの方法があります。
insert in mo (host, un_no, status, s_date, compliant_status)
select host, un_no, status, s_date,
case
when min_host_status <> max_host_status then 'PARTIAL'
when min_host_status = 'NC' then 'NON_COMPLIANT'
else min_host_status
end
from (
select t.*,
min(status) over(partition by host) min_host_status,
max(status) over(partition by host) max_host_status
from tmp t
) t
アイデアはstatus
、それぞれの最小値と最大値を比較することhost
です。異なる場合compliant_status
は「PARTIAL」です。それ以外の場合は、「NC」を「NON_COMPLIANT」に変更し、他の値(「COMPLIANT」)はそのままにします。
ここではサブクエリは厳密には必要ありません。外部クエリでウィンドウ関数を直接使用することもできます。同じ表情を何度も繰り返さないので使ってみました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加