Sql 与Oracle的分组问题

Sql 与Oracle的分组问题,sql,oracle,grouping,aggregate-functions,aggregation,Sql,Oracle,Grouping,Aggregate Functions,Aggregation,我有以下数据: 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

我有以下数据:

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列,并将所有推送的总和加起来,因为每个记录都有用户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,但它正是我想要的。非常感谢。然而,我不明白为什么它会起作用。MAX函数返回表达式的最大值。那么,如何以日期的最大值来聚合这样的记录呢?如果你有时间,请解释一下。谢谢您不希望按
行\u LST\u UPD\u TS
分组,因为您不希望该列的每个唯一值都有单独的行。因此,您需要将其从
GROUP BY
子句中删除;但在分组查询中,选择列表中的每个表达式必须是分组列或组函数。因此,您需要对该列应用一个group函数,以使查询正常工作
MAX
恰好是一个组函数,它给出了您想要的结果。
SELECT SUM(Q.SUM_OF_ALL_PUSHES) AS SUM_OF_ALL_PUSHES, Q.USER_LOGIN, Q.COMPONENT_NAME, MAX(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 
ORDER BY MAX(Q.ROW_LST_UPD_TS) ASC