我有以下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
答案 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)并选择语句