2012-02-23 33 views
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 

請幫助。

回答

1

聽起來就像你不想按時間戳分組,但相反,它應用了一個聚合函數(我猜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 
+0

我永遠不會想到使用Max,但它確實如我所願。非常感謝。但我不明白它爲什麼有效。 MAX函數返回表達式的最大值。那麼如何將日期的最大值彙總爲這樣的記錄呢?請解釋一下你是否有時間。謝謝! – Zolt 2012-02-23 18:58:41

+0

您不希望按「ROW_LST_UPD_TS」進行分組,因爲您不需要爲該列的每個唯一值分別設置一行。因此,您需要將它從「GROUP BY」子句中移除;但在分組查詢中,選擇列表中的每個表達式必須是分組列或是組函數。因此,您需要將組功能應用於此列以使查詢生效。 'MAX'恰好是給出你想要的結果的組函數。 – 2012-02-23 19:57:37