SQL 从 2 个查询创建聚合结果

SQL create aggregated result from 2 queries

我正在研究由 PostgresDB 支持的气流。我正在尝试 运行 审计并从 2 SQL 表创建汇总报告。 joinssubqueries 在我重新学习时彻底混淆了。

关于我的问题的详细信息:

表 1

select dag_id, owners from aaf.public.dag order by dag_id;

sample result =>

dag_id                  | owners
-------------------------------
aa_example_hello_world     owner1
aa_example_sud_test        owner2

表 2

select dag_id, state from aaf.public.dag_run;

sample result =>
dag_id                  | state
-------------------------------
aa_example_hello_world    success
aa_example_hello_world    failed
aa_example_hello_world    running
aa_example_sud_test       failed
aa_example_hello_world    success
aa_example_sud_test       failed
aa_example_hello_world    failed

我想达到的目标=>

dag_id                  | owners    |    run_percentage_success
------------------------------------------------------------
aa_example_hello_world    owner1          40 #->(which is 2success/5total from Table2 * 100)

到目前为止我尝试了什么=>

第一次尝试(尝试查看我是否可以获得个人 dag_id 的摘要)

select
    (select cast(COUNT(id) as FLOAT) from aaf.public.dag_run where dag_id = 'aa_example_hello_world' and state = 'success' group by dag_id order by dag_id) /
    (select cast(COUNT(id) as FLOAT) from aaf.public.dag_run where dag_id = 'aa_example_hello_world' group by dag_id order by dag_id)*100

第二次尝试(尝试对所有 dag_id 概括尝试 1)

select
    (select cast(COUNT(id) as FLOAT) from aaf.public.dag_run where dag_id in (select dag_id from aaf.public.dag order by dag_id) and state = 'failed' group by dag_id order by dag_id) /
    (select cast(COUNT(id) as FLOAT) from aaf.public.dag_run where dag_id in (select dag_id from aaf.public.dag order by dag_id) group by dag_id order by dag_id)*100

^ this fails because it cannot divide columnar data

第三次尝试

select a.dag_id, a.owners, cast(count(b.dag_id) as Float)  from aaf.public.dag as a, aaf.public.dag_run as b where b.state = 'success' and b.dag_id = a.dag_id group by a.dag_id;

^ BUT I am not able to compute the `divisions` for my expected result

您可以加​​入并聚合:avg() 可以方便地计算成功率:

select d.dag_id, d.owners, avg( (dr.status = 'success')::int ) avg_success
from aaf.public.dag d
inner join aaf.public.dag_run dr
    on dr.dag_id = d.dag_id
group by d.dag_id
order by d.dag_id;

这会为您提供一个介于 01 之间的小数值来表示成功率 - 如果您想要百分比,可以将其乘以“100”。

使用条件聚合(即聚合函数内的CASE WHEN表达式):

select
  dag_id,
  d.owners,
  count(case when dr.state = 'success' then 1 end)::float / count(*)::float * 100.0
from aaf.public.dag_run dr
join aaf.public.dag d using(dag_id)
group by dag_id
order by dag_id;