如何在sql中找到中位数

时间:2017-05-22 17:31:13

标签: sql oracle oracle-sqldeveloper median partition

我有以下sql查询,它给出了按月,周和日分组的总h_time。相反,我希望月,周和日的中位数h_time。我如何在Oracle SQL中执行此操作?

 SELECT DAY,

MEDIAN(H_TIME) AS HANDLE_TIME

FROM(
    select 
MONTH, WEEK, DAY,

    CASE 
        WHEN C.JOINED IS NOT NULL
            THEN (NVL(C.TOTAL_TALK,0) + NVL(C.TOTAL_HOLD,0) + (NVL((C.DATETIME - C.START_DATETIME)*86400,0)) )/86400 
            ELSE 0 END AS H_TIME

from TABLE1 C


LEFT JOIN TABLE2 S
ON S.ID = C.ID
where c.direct = 'Inbound'
)

where UPPER(ITEM1) like 'SOMETHING%' 

GROUP BY


DAY

输出:

DAY              HANDLE_TIME
14-APR-17   .00567129629629629629629629629629629629629
15-APR-17   0
17-APR-17   0
17-APR-17   .00422453703703703703703703703703703703703
19-APR-17   .00269675925925925925925925925925925925925
19-APR-17   0
19-APR-17   0
19-APR-17   .00824074074074074074074074074074074074074

4 个答案:

答案 0 :(得分:2)

尝试更换:

SUM(H_TIME) AS HANDLE_TIME

by:

MEDIAN(H_TIME) AS HANDLE_TIME

(第3行)


编辑: 这几个月,请替换:

select 
MONTH, WEEK, DAY,

人:

select 
MONTH,

GROUP BY

MONTH
,WEEK
,DAY

人:

GROUP BY 
MONTH


这几周,请替换:

select 
MONTH, WEEK, DAY,

人:

select 
MONTH, WEEK,

GROUP BY

MONTH
,WEEK
,DAY

人:

GROUP BY 
MONTH
,WEEK

答案 1 :(得分:2)

问题不在于median()功能,而在于group by列。

Oracle DATE数据类型实际上是DATETIME,例如2017-05-24 08:09:11因此,在比较日期时,我们必须考虑时间因素。

最简单的方法是截断日期值,将时间设置为午夜。所以在你的情况下看起来像这样:

SELECT trunc(day) as DAY,
       MEDIAN(H_TIME) AS H_TIME
FROM (
    ...
)
group by trunc(day)

此解决方案比使用to_char()删除time元素更好,因为数据类型仍为DATE。因此,如果您对结果order by trunc(day)进行排序,则会获得预期的日历顺序,而对to_char(day)进行排序则会产生意外的字母数字排序。

答案 2 :(得分:1)

您的问题可能来自DATE类型携带的时间部分(即使您没有明确设置它)。

要摆脱它,你可以使用截断功能。

替换:

SELECT DAY,

人:

SELECT trunc(DAY)

GROUP BY DAY

人:

GROUP BY trunc(DAY)

答案 3 :(得分:0)

尝试在group by中使用to_char(DAY)并选择语句