Sql 通过计算列的百分比将记录插入另一个表的查询
我有两个Postgres表,结构如下:Sql 通过计算列的百分比将记录插入另一个表的查询,sql,postgresql,case,sql-insert,percentage,Sql,Postgresql,Case,Sql Insert,Percentage,我有两个Postgres表,结构如下: Table "public.tmp" Column | Type | Collation | Nullable | Default -------------------+-------------------------+-----------+----------+--------- MY_SL | character varying(50)
Table "public.tmp"
Column | Type | Collation | Nullable | Default
-------------------+-------------------------+-----------+----------+---------
MY_SL | character varying(50) | | |
Release | character varying(50) | | |
HOSTNAME | 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('mo_id_seq'::regclass)
HOSTNAME | 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 |
C_PERCENT | character varying(50) | | not null |
假设tmp表中有如下数据:
Table: tmp
MY_SL | Release | HOSTNAME | UN NO.| STATUS | S_DATE
------------+-------------+-----------+----------------------+------------------
2 | 1 | RhelTest | 7:1:8 | COMPLIANT | 2020-08-26
12 | 1 | RhelTest | 7:1:9 | COMPLIANT | 2020-08-26
22 | 2 | RhelTest | 7:2:1 | COMPLIANT | 2020-08-26
4 | 1 | RhelTest | 7:2:10 | NC | 2020-08-26
12 | 1 | RhelTest | 7:1:9 | COMPLIANT | 2020-08-26
22 | 2 | RhelTest | 7:2:1 | COMPLIANT | 2020-08-26
12 | 1 | RhelTest | 7:1:9 | NC | 2020-08-26
22 | 2 | RhelTest | 7:2:1 | COMPLIANT | 2020-08-26
11 | 2 | RhelTest | 7:2:11 | NC | 2020-08-26
1 | 3 | Demo1 | 7:2:11 | NC | 2020-08-26
23 | 3 | Demo1 | 7:2:11 | NC | 2020-08-26
1 | 3 | Demo1 | 7:2:11 | NC | 2020-08-26
23 | 3 | Demo1 | 7:2:11 | NC | 2020-08-26
1 | 3 | Demo1 | 7:2:11 | NC | 2020-08-26
23 | 3 | Demo1 | 7:2:11 | NC | 2020-08-26
333 | 3 | Demo2 | 7:2:11 | COMPLIANT | 2020-08-26
333 | 3 | Demo2 | 7:2:11 | COMPLIANT | 2020-08-26
333 | 3 | Demo2 | 7:2:11 | COMPLIANT | 2020-08-26
333 | 3 | Demo2 | 7:2:11 | COMPLIANT | 2020-08-26
333 | 3 | Demo3 | 7:2:11 | COMPLIANT | 2020-08-26
333 | 3 | Demo3 | 7:2:11 | NC | 2020-08-26
333 | 3 | Demo3 | 7:2:11 | NC | 2020-08-26
333 | 3 | Demo3 | 7:2:11 | NC | 2020-08-26
333 | 3 | Demo3 | 7:2:11 | NC | 2020-08-26
432 | 3 | Demo3 | 7:2:11 | NC | 2020-08-26
333 | 3 | Demo3 | 7:2:11 | NC | 2020-08-26
111 | 3 | Demo3 | 7:2:11 | NC | 2020-08-26
333 | 3 | Demo3 | 7:2:11 | NC | 2020-08-26
321 | 3 | Demo3 | 7:2:11 | NC | 2020-08-26
564 | 3 | Demo3 | 7:2:11 | NC | 2020-08-26
958 | 3 | Demo3 | 7:2:11 | COMPLIANT | 2020-08-26
我在下面有一个脚本,它根据所需的条件将数据从public.tmp插入public.mo表
- 如果列状态具有特定主机名的混合值(COMPLIANT和NC),则COMPLIANT_状态为PARTIAL和inc
- 如果所有值都与特定主机名兼容,则“兼容_”状态为“兼容”,并且
- 如果特定主机名的所有值均为NC,则符合的_状态为不符合
如果我没有弄错,您可以使用窗口功能:
select m.*,
100 * avg((compliant_status = 'COMPLIANT')::int) over(partition by hostname) c_percent
case when avg((compliant_status = 'COMPLIANT')::int) over(partition by hostname) >= 0.8
then 'COMPLIANT'
else 'NON_COMPLIANT'
end as final_compliant_status
from mo m
@谢谢你的帮助。
下面的查询帮助我满足了我的要求
insert into mo ("HOSTNAME","UN NO.","STATUS","S_DATE", compliant_status, c_percent)
select "HOSTNAME","UN NO.","STATUS","S_DATE",
case
when avg(("STATUS" = 'COMPLIANT')::int) over(partition by "HOSTNAME") >= 0.8
then 'COMPLIANT'
else 'NON_COMPLIANT'
end as compliant_status,
100 * avg(("STATUS" = 'COMPLIANT')::int) over(partition by "HOSTNAME") c_percent
from mo m
;
select m.*,
100 * avg((compliant_status = 'COMPLIANT')::int) over(partition by hostname) c_percent
case when avg((compliant_status = 'COMPLIANT')::int) over(partition by hostname) >= 0.8
then 'COMPLIANT'
else 'NON_COMPLIANT'
end as final_compliant_status
from mo m
insert into mo ("HOSTNAME","UN NO.","STATUS","S_DATE", compliant_status, c_percent)
select "HOSTNAME","UN NO.","STATUS","S_DATE",
case
when avg(("STATUS" = 'COMPLIANT')::int) over(partition by "HOSTNAME") >= 0.8
then 'COMPLIANT'
else 'NON_COMPLIANT'
end as compliant_status,
100 * avg(("STATUS" = 'COMPLIANT')::int) over(partition by "HOSTNAME") c_percent
from mo m
;