Sql 从仓库事实表获取成功/失败率的最佳查询
我正在尝试微调一个查询,并希望得到一些反馈。我有一个job_fact warehouse表,其中包含作业最终事件final_event类型的度量单位。我正在尝试对这个事实进行查询,这将给我一个成功/失败率。以下是我目前掌握的情况:Sql 从仓库事实表获取成功/失败率的最佳查询,sql,postgresql,data-warehouse,fact-table,Sql,Postgresql,Data Warehouse,Fact Table,我正在尝试微调一个查询,并希望得到一些反馈。我有一个job_fact warehouse表,其中包含作业最终事件final_event类型的度量单位。我正在尝试对这个事实进行查询,这将给我一个成功/失败率。以下是我目前掌握的情况: SELECT CASE WHEN jf.final_event_type IN (4,6,8,9) THEN count(final_event_type) END as num_failures, CASE WHEN jf.final_event_type
SELECT
CASE WHEN jf.final_event_type IN (4,6,8,9) THEN count(final_event_type) END as num_failures,
CASE WHEN jf.final_event_type IN (5,7,10) THEN count(final_event_type) END as num_successes
FROM job_fact jf
GROUP BY jf.final_event_type;
此查询仅提供两行结果中的原始成功和失败值:
+----------------------+-----------------------+
| num_failures | num_successes |
+----------------------+-----------------------+
| [NULL] | 6 |
| 14 | [NULL] |
+----------------------+-----------------------+
有没有人知道有没有办法a在一行上得到结果,b能够计算两者之间的比率,例如故障百分比。我假设有人会告诉我,我最好为此编写一个程序,但如果可能的话,我希望避免这样做。我知道有一种优雅的方法可以做到这一点,但我想我的SQLFoo现在缺少了
我正在运行PostgreSQL 9.0.1。谢谢你提供的任何帮助
更新
根据@Ronnis选择的答案,这里是我的最后一个问题,以防您怀疑:
select
sum(case when final_event_type in(4,6,8,9) then 1 else 0 end) as failures,
sum(case when final_event_type in(5,7,10) then 1 else 0 end) as successes,
count(final_event_type) as total_events,
sum(case when final_event_type in(4,6,8,9) then 1 else 0 end) / count(final_event_type)::decimal as failure_percentage,
sum(case when final_event_type in(5,7,10) then 1 else 0 end) / count(final_event_type)::decimal as success_percentage
from job_fact;
如果最终事件类型为4、5、6、7、8、9、10的情况会影响到表中的大部分内容,我认为以下几点将非常有效:
select sum(case when final_event_type in(4,6,8,9) then 1 else 0 end) as failures
,sum(case when final_event_type in(5,7,10) then 1 else 0 end) as successes
from job_fact;
编辑
我不知道postgresq是如何执行上述查询的。在Oracle中,有一个称为索引快速完全扫描的访问路径,它基本上将索引视为一个表。没有缓慢的遍历,只是一次高效的完全扫描。好处是{final_event_type}上的索引可以比整个表小得多。
我没有提到位图索引,因为这样会更快。如果最终事件类型为4,5,6,7,8,9,10会影响表的大部分内容,我认为以下内容会非常有效:
select sum(case when final_event_type in(4,6,8,9) then 1 else 0 end) as failures
,sum(case when final_event_type in(5,7,10) then 1 else 0 end) as successes
from job_fact;
编辑
我不知道postgresq是如何执行上述查询的。在Oracle中,有一个称为索引快速完全扫描的访问路径,它基本上将索引视为一个表。没有缓慢的遍历,只是一次高效的完全扫描。好处是{final_event_type}上的索引可以比整个表小得多。
我没有提到位图索引,因为这样会更快。该查询的原始运行无效。。。你能解释一下你的意思吗?你必须删除引号,否则查询会失败。也许你也应该将总结果转换为十进制,否则num_failures/Total将被四舍五入。好的,在我的pg版本中,对from子选择中别名周围的引号做了一点修改。让它运行,虽然比率列的计算结果为0,但仍在修补。哈,刚刚看到你的评论。这两件事都做了,效果很好。在此查询中使用如此多的子选择会对性能造成什么影响?对不起,我更喜欢Microsoft SQL,因此我在引号中表示歉意。只要您的索引是最新的,您就永远不会看到像这样调用代码的任何问题。该查询的原始运行无效。。。你能解释一下你的意思吗?你必须删除引号,否则查询会失败。也许你也应该将总结果转换为十进制,否则num_failures/Total将被四舍五入。好的,在我的pg版本中,对from子选择中别名周围的引号做了一点修改。让它运行,虽然比率列的计算结果为0,但仍在修补。哈,刚刚看到你的评论。这两件事都做了,效果很好。在此查询中使用如此多的子选择会对性能造成什么影响?对不起,我更喜欢Microsoft SQL,因此我在引号中表示歉意。只要你的索引是最新的,你就永远不会看到像这样调用代码的任何问题。这与我所希望的非常接近。谢谢这离我所希望的要近得多。谢谢