在oracle中平均一个组的成员
averaging members of a group in oracle
我正在处理一个查询,以显示一周内我们服务器的一般使用情况。更具体地说,我试图找到一周中特定日期的特定小时内的平均请求数。我知道平均功能在那里,但试图只对每个组的成员进行平均被证明很麻烦。当我 运行 这个查询时:
SELECT DOW, HH24, AVG(LISTAGG(SV_REQUESTS) WITHIN GROUP (ORDER BY SV_REQUESTS))
FROM
(SELECT
COUNT(*) AS SV_REQUESTS,
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'MM') AS MM,
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'DD') AS DD,
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'HH24') AS HH24,
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'D-DAY') AS DOW
FROM ACTIVITY_ACCUMULATOR
WHERE TIMESTAMP > to_date('01-08-2015','DD-MM-YYYY')
GROUP BY
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'HH24'),
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'MM'),
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'DD'),
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'D-DAY'))
GROUP BY DOW, HH24;
我得到:
ORA-00937: not a single-group group function
00937. 00000 - "not a single-group group function"
*Cause:
*Action:
有人能帮忙吗?我需要另一个子查询才能正确执行此操作吗?
我相信你只是想要 avg(sv_requests)
。聚合函数(例如 avg
或 count
)固有地对您分组所依据的行组进行操作。因此,对于 DOW
和 HH24
的每个不同组合,相应行的 sv_requests
将被平均。
SELECT DOW, HH24, AVG(SV_REQUESTS)
FROM
(SELECT
COUNT(*) AS SV_REQUESTS,
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'MM') AS MM,
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'DD') AS DD,
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'HH24') AS HH24,
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'D-DAY') AS DOW
FROM ACTIVITY_ACCUMULATOR
WHERE TIMESTAMP > to_date('01-08-2015','DD-MM-YYYY')
GROUP BY
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'HH24'),
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'MM'),
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'DD'),
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'D-DAY'))
GROUP BY DOW, HH24;
我正在处理一个查询,以显示一周内我们服务器的一般使用情况。更具体地说,我试图找到一周中特定日期的特定小时内的平均请求数。我知道平均功能在那里,但试图只对每个组的成员进行平均被证明很麻烦。当我 运行 这个查询时:
SELECT DOW, HH24, AVG(LISTAGG(SV_REQUESTS) WITHIN GROUP (ORDER BY SV_REQUESTS))
FROM
(SELECT
COUNT(*) AS SV_REQUESTS,
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'MM') AS MM,
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'DD') AS DD,
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'HH24') AS HH24,
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'D-DAY') AS DOW
FROM ACTIVITY_ACCUMULATOR
WHERE TIMESTAMP > to_date('01-08-2015','DD-MM-YYYY')
GROUP BY
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'HH24'),
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'MM'),
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'DD'),
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'D-DAY'))
GROUP BY DOW, HH24;
我得到:
ORA-00937: not a single-group group function
00937. 00000 - "not a single-group group function"
*Cause:
*Action:
有人能帮忙吗?我需要另一个子查询才能正确执行此操作吗?
我相信你只是想要 avg(sv_requests)
。聚合函数(例如 avg
或 count
)固有地对您分组所依据的行组进行操作。因此,对于 DOW
和 HH24
的每个不同组合,相应行的 sv_requests
将被平均。
SELECT DOW, HH24, AVG(SV_REQUESTS)
FROM
(SELECT
COUNT(*) AS SV_REQUESTS,
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'MM') AS MM,
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'DD') AS DD,
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'HH24') AS HH24,
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'D-DAY') AS DOW
FROM ACTIVITY_ACCUMULATOR
WHERE TIMESTAMP > to_date('01-08-2015','DD-MM-YYYY')
GROUP BY
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'HH24'),
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'MM'),
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'DD'),
TO_CHAR(TO_DATE(TIMESTAMP,'DD-MM-YYYY HH24:MI:SS'),'D-DAY'))
GROUP BY DOW, HH24;