Проблема группировки с Oracle - PullRequest
       17

Проблема группировки с Oracle

0 голосов
/ 23 февраля 2012

У меня есть следующие данные:

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 и Компонент А.

Итак, в общем, мне нужно удалитьдублирование данных в других столбцах и суммирование значений в первом столбце в зависимости от пользователя и компонента.Поэтому набор результатов должен выглядеть следующим образом:

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 

Пожалуйста, помогите.

1 Ответ

1 голос
/ 23 февраля 2012

Звучит так, будто вы не хотите группировать по отметке времени, а вместо этого примените к ней функцию агрегирования (я предполагаю 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...