【问题标题】:How to find median in sql如何在sql中找到中位数
【发布时间】:2017-05-22 17:31:12
【问题描述】:

我有以下 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

【问题讨论】:

  • 在第 3 行 @GurwinderSingh 或者你的意思是在子查询中?
  • @GurwinderSingh 错过了复制。抱歉,已更新查询。
  • 请提供样本数据和该数据所需的输出。
  • 请提供表 TABLE1 和 TABLE2 的示例数据(具有实际值的行),并告诉我们您期望 那个 数据的输出。
  • 您确定您的某些“DAY”值不包含您未显示的时间组件(使它们不同)吗?

标签: sql oracle oracle-sqldeveloper median partition


【解决方案1】:

尝试替换:

SUM(H_TIME) AS HANDLE_TIME

作者:

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

【讨论】:

  • 谢谢,但这只会给我“DAY”的中间h_time,对吧?那么我如何获得一个月和一周的时间呢?因为早些时候当我进行求和时,将“DAY”的所有 h_times 相加,然后我在 excel 中创建了一个数据透视表,我也可以得到周和月的总和。但对于中位数,我猜这不会起作用。
  • 不,不会。为了做到这一点,您必须与您的小组一起玩。 (删除具有每周中位数的日期和每月的星期)
  • 您的意思是创建单独的查询?因为我想要所有的日子、星期和月份
  • 是的,我认为这将是最有效的方法,因为如果没有数据冗余,您将无法在同一查询中显示几天和一周或一周和几个月的分析,这是不好的 :)。
  • @Arman - 最大的问题是,虽然部分总和的总和等于整体全局总和,但对于中位数而言并非如此。 (就此而言,平均值也不是真的。)没有办法计算一周或一个月的中位数时间,只知道“天”级别的中位数,通过旋转或以任何其他方式。
【解决方案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() 删除时间元素要好,因为数据类型仍然是 DATE。因此,如果您对结果进行排序 order by trunc(day) 会得到预期的日历顺序,而在 to_char(day) 上排序会产生意想不到的字母数字顺序。

【讨论】:

    【解决方案3】:

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

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

    替换:

    SELECT DAY,
    

    作者:

    SELECT trunc(DAY)
    

    还有:

    GROUP BY DAY
    

    作者:

    GROUP BY trunc(DAY)
    

    【讨论】:

      【解决方案4】:

      尝试在group by和select语句中使用to_char(DAY)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-01
        • 1970-01-01
        • 2021-11-11
        • 2021-11-10
        • 2018-04-05
        • 2020-10-27
        • 2012-05-15
        • 2021-03-17
        相关资源
        最近更新 更多