SQL 从 2 个查询创建聚合结果
SQL create aggregated result from 2 queries
我正在研究由 PostgresDB 支持的气流。我正在尝试 运行 审计并从 2 SQL 表创建汇总报告。 joins
和 subqueries
在我重新学习时彻底混淆了。
关于我的问题的详细信息:
表 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;
这会为您提供一个介于 0
和 1
之间的小数值来表示成功率 - 如果您想要百分比,可以将其乘以“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;
我正在研究由 PostgresDB 支持的气流。我正在尝试 运行 审计并从 2 SQL 表创建汇总报告。 joins
和 subqueries
在我重新学习时彻底混淆了。
关于我的问题的详细信息:
表 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;
这会为您提供一个介于 0
和 1
之间的小数值来表示成功率 - 如果您想要百分比,可以将其乘以“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;