0
,我有以下数据:分组问题与Oracle
SUM_OF_ALL_PUSHES | USER_LOGIN | COMPONENT_NAME | ROW_LST_UPD_TS
-------------------|---------------|-------------------|-------------------------
61 | DOMAIN\abc | Component A | 22/02/12 12:58:26.325 PM
14 | DOMAIN\xyz | Component B | 22/02/12 05:20:52.565 PM
17 | DOMAIN\xyz | Component A | 22/02/12 05:21:58.045 PM
34 | DOMAIN\abc | Component A | 22/02/12 05:44:20.274 PM
38 | DOMAIN\abc | Component A | 22/02/12 06:28:41.465 PM
我使用导出数据如下:
SELECT SUM(Q.SUM_OF_ALL_PUSHES) AS SUM_OF_ALL_PUSHES, Q.USER_LOGIN, Q.COMPONENT_NAME, Q.ROW_LST_UPD_TS FROM(SELECT
SUM(REGEXP_SUBSTR(SUBSTR(EVENT_MSG, INSTR(EVENT_MSG, ' ', 1,1), INSTR(EVENT_MSG, ' ', 1,1)) , '[0-9]+')) AS "SUM_OF_ALL_PUSHES",
USER_LOGIN,
COMPONENT_NAME,
EVENT_MSG,
ROW_LST_UPD_TS
FROM EVENT_MGT.EVENT_LOG
WHERE
ROW_LST_UPD_TS BETWEEN TRUNC(SYSDATE - 1) AND TRUNC(SYSDATE) - 1/86400
AND SUBSTR(EVENT_MSG,1 ,INSTR(EVENT_MSG, 'd', 1,1)) = 'Received'
GROUP BY
USER_LOGIN,
COMPONENT_NAME,
EVENT_MSG,
ROW_LST_UPD_TS) Q
GROUP BY COMPONENT_NAME, USER_LOGIN, ROW_LST_UPD_TS
ORDER BY ROW_LST_UPD_TS ASC
的问题是,我需要总和每个号码用户按组件。所以在上面的结果集中,我需要聚合第1,4和5列,并将SUM_OF_ALL_PUSHES的值加起来,因为每条记录都有用户abc和组件A.
所以总之,我需要删除数据在其他列中复制,并根据用户和组件对第一列中的值进行求和。所以结果集应该是这样的:
SUM_OF_ALL_PUSHES | USER_LOGIN | COMPONENT_NAME | ROW_LST_UPD_TS
-------------------|---------------|-------------------|-------------------------
133 | DOMAIN\abc | Component A | 22/02/12 12:58:26.325 PM
14 | DOMAIN\xyz | Component B | 22/02/12 05:20:52.565 PM
17 | DOMAIN\xyz | Component A | 22/02/12 05:21:58.045 PM
请帮助。
我永远不会想到使用Max,但它确实如我所愿。非常感谢。但我不明白它为什么有效。 MAX函数返回表达式的最大值。那么如何将日期的最大值汇总为这样的记录呢?请解释一下你是否有时间。谢谢! – Zolt 2012-02-23 18:58:41
您不希望按“ROW_LST_UPD_TS”进行分组,因为您不需要为该列的每个唯一值分别设置一行。因此,您需要将它从“GROUP BY”子句中移除;但在分组查询中,选择列表中的每个表达式必须是分组列或是组函数。因此,您需要将组功能应用于此列以使查询生效。 'MAX'恰好是给出你想要的结果的组函数。 – 2012-02-23 19:57:37