(SQL)如何应用具有百分位数的case语句来计算

时间:2017-11-29 13:59:11

标签: sql postgresql

我正在使用案例陈述来计算某些标准的统计数据,如下面的

avg(case when det.detection_time >0 then det.blocked_time end) 

and

sum(case when det.detection_time  =0 then 1 else 0 end) 

我应该如何应用案例陈述来获得中位数。

目前我得到的中位数如下:

PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER by det.blocked_time)

我应该如何将条件“det.detection_time> 0”的情况添加到PERCENTILE_CONT块以获得其中det.detection_time> 0

的组的中位数

2 个答案:

答案 0 :(得分:2)

您可以使用FILTER来实现它并使您的SQL更清洁:

SELECT
    avg(det.blocked_time) FILTER (WHERE det.detection_time > 0),
    count(*) FILTER (WHERE det.detection_time = 0),
    percentile_cont(0.5) WITHIN GROUP(ORDER by det.blocked_time) FILTER (WHERE det.detection_time > 0)
FROM 
    my_table det;   

答案 1 :(得分:1)

执行此操作的正确方法如下:

PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY CASE WHEN det.detection_time >0 THEN det.blocked_time ELSE NULL END) AS [COLUMN NAME]

由于PERCENTILE_CONT是类似于AVG的汇总fxn,因此您需要分组