Sql 通过计算列的百分比将记录插入另一个表的查询

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)

我有两个Postgres表,结构如下:

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
;