如何在sql中查找中间值

如何在sql中查找中间值,sql,oracle,oracle-sqldeveloper,median,partition,Sql,Oracle,Oracle Sqldeveloper,Median,Partition,我有下面的sql查询,它给出了按月、周和日分组的总h_时间。相反,我想要月、周和日的平均h_时间。如何在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_HOL

我有下面的sql查询,它给出了按月、周和日分组的总h_时间。相反,我想要月、周和日的平均h_时间。如何在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
尝试替换:

SUM(H_TIME) AS HANDLE_TIME
作者:

(第3行)


编辑: 对于以下月份,替换:

select 
MONTH, WEEK, DAY,
select 
MONTH, WEEK, DAY,
作者:

以及:

作者:


在接下来的几周内,更换:

select 
MONTH, WEEK, DAY,
select 
MONTH, WEEK, DAY,
作者:

以及:

作者:

尝试替换:

SUM(H_TIME) AS HANDLE_TIME
作者:

(第3行)


编辑: 对于以下月份,替换:

select 
MONTH, WEEK, DAY,
select 
MONTH, WEEK, DAY,
作者:

以及:

作者:


在接下来的几周内,更换:

select 
MONTH, WEEK, DAY,
select 
MONTH, WEEK, DAY,
作者:

以及:

作者:


问题不在于
median()
函数,而是
groupby

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

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

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

此解决方案优于使用
to_char()
删除时间元素,因为数据类型仍然是DATE。因此,如果您按trunc(day)对结果进行排序,您将得到预期的日历顺序,而按
排序到_char(day)
将给出意外的字母数字顺序。

问题不在于
中值()
函数,而在于
分组依据

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

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

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

此解决方案优于使用
to_char()
删除时间元素,因为数据类型仍然是DATE。因此,如果您按trunc(day)对结果进行排序,您将得到预期的日历顺序,而按
to_char(day)
进行排序将得到意外的字母数字顺序。

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

尝试使用to_char(day)在group by和select语句中,您的问题可能来自日期类型携带的时间部分(即使您没有明确设置它)

要摆脱它,可以使用trunc函数

替换:

SELECT DAY,
作者:

以及:

作者:


您的问题可能来自日期类型携带的时间部分(即使您没有显式设置它)

要摆脱它,可以使用trunc函数

替换:

SELECT DAY,
作者:

以及:

作者:



在第3行@gurvindersingh,或者你是说在子查询中?@gurvindersingh没有复制。抱歉,已更新查询。请提供该数据的示例数据和所需输出。请提供表1和表2的示例数据(具有实际值的行),并告诉我们您希望该数据的输出是什么。是否确实某些“日”值不包含时间组件(使其不同)您没有显示?在第3行@gurvindersingh或您的意思是在子查询中?@gurvindersingh没有复制。抱歉,已更新查询。请提供该数据的示例数据和所需输出。请提供表1和表2的示例数据(具有实际值的行),并告诉我们您希望该数据的输出是什么。是否确实某些“日”值不包含时间组件(使其不同)你没有显示出来吗?谢谢,但这只会给我“一天”的平均h_时间,对吗?那我怎样才能得到每月和每周的工资呢?因为之前我在做sum的时候,就是把“一天”的所有h_时间相加,然后我在excel中创建了一个透视表,我可以得到周和月的总和。但对于中位数来说,我想这是行不通的。不,不行。为了做到这一点,你必须和你的团队一起玩。(删除每周中位数的日期和每月中位数的周)您的意思是创建单独的查询?因为我想要全天、周和月,我认为这是最有效的方法,因为在没有数据冗余的情况下,无法在同一查询上显示对天、周或周和月的分析,这是不好的:)。@Arman-最大的问题是,虽然部分和的总和等于整体全局和,但中位数的情况并非如此。(就这一点而言,平均值也是如此。)没有办法计算一周或一个月的时间中位数,只要知道“天”级别的中位数,通过旋转或任何其他方式。谢谢,但这只会给我“天”的中位数h_时间,对吗?那我怎样才能得到每月和每周的工资呢?因为之前我在做sum的时候,就是把“一天”的所有h_时间相加,然后我在excel中创建了一个透视表,我可以得到周和月的总和。但对于中位数来说,我想这是行不通的。不,不行。为了做到这一点,你必须和你的团队一起玩。(删除每周中位数的日期和每月中位数的周)您的意思是创建单独的查询?因为我想要全天、周和月,我认为这是最有效的方法,因为在没有数据冗余的情况下,无法在同一查询上显示对天、周或周和月的分析,这是不好的:)。@Arman-最大的问题是,虽然部分和的总和等于整体全局和,但中位数的情况并非如此。(就这一点而言,平均值也是如此。)没有办法计算一周或一个月的时间中位数,只需知道“日”水平的中位数,通过旋转或任何其他方式。
GROUP BY trunc(DAY)