Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从仓库事实表获取成功/失败率的最佳查询_Sql_Postgresql_Data Warehouse_Fact Table - Fatal编程技术网

Sql 从仓库事实表获取成功/失败率的最佳查询

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

我正在尝试微调一个查询,并希望得到一些反馈。我有一个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 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,因此我在引号中表示歉意。只要你的索引是最新的,你就永远不会看到像这样调用代码的任何问题。这与我所希望的非常接近。谢谢这离我所希望的要近得多。谢谢