2012-05-20 17 views
0

我是需要某些建議的SQL新手。什麼是最有效的(運行速度最快的查詢)的方式,採取以下最佳Oracle SQL查詢完成在單個表中包含〜7,000,000條記錄的多個列的分組

選擇表中的所有列離職後

-Performing一個「GROUP BY」基於包含在兩列中的唯一值:「 top_line_id「和」external_reference「。

- 根據包含在不同字段(如support_id)中的最大值或最小值(無論哪一個),從每個組中選擇一條記錄。

我的團隊中有人提供了下面的查詢,但我似乎無法讓它工作。當我嘗試執行它時收到一條錯誤消息,指出「無效關係運算符」。

Select * 
from STAGE.SFS_GH_R3_IB_ENTLMNT_CONTACTS 
Where support_id, external_reference, top_line_id in (
     select max(support_id), 
       external_reference, 
       top_line_id from STAGE.SFS_GH_R3_IB_ENTLMNT_CONTACTS 
) 

還有一件事 - 我們正在執行組的列通過在某些記錄中包含空值。我們希望那些排除在查詢之外的人。

您可以提供的任何援助非常感謝。

回答

2

儘管您將此短語作爲查詢組使用,但還有另一種使用row_number()的方法。這根據「order by」子句枚舉組中的每一行。在下面的查詢,它列舉了基於external_reference和top_line_id各小組,由support_id下令:

select * 
from (Select t.*, 
      row_number() over (partition by external_reference, top_line_id 
           order by support_id) as seqnum 
     from STAGE.SFS_GH_R3_IB_ENTLMNT_CONTACTS t 
    ) 
where seqnum = 1 
+0

感謝戈登。我沒有考慮使用row_number和「order by」子句。我會試一試併發布結果。 – Sean

+0

Hi Gordon,在Oracle 10g中是「row_number」和「seqnum」僞列。蟾蜍沒有將「row_number」識別爲保留字,但它確實承認了ROWNUM。蟾蜍也沒有認出「seqnum」。我可以用「sequence.CURRVAL」或「sequence.NEXTVAL」來代替「seqnum」嗎? – Sean

+1

我想出了錯誤。您上面提供的查詢是100%正確的,除了我需要在t之後包含逗號。* – Sean

0

這應該工作(不能測試)


SELECT 
    * 
FROM 
    stage.sfs_gh_r3_ib_entlmnt_contacts 
WHERE 
    (support_id, external_reference, top_line_id) IN 
    (
     SELECT 
     max(support_id), 
     external_reference, 
     top_line_id 
     FROM 
     stage.sfs_gh_r3_ib_entlmnt_contacts 
     WHERE 
     external_reference IS NOT NULL AND 
     top_line_id IS NOT NULL 
     GROUP BY 
     top_line_id, external_reference 
    ) 
+0

謝謝6opuc。我正在運行查詢。一旦它結束運行,我會讓你知道執行時間。 – Sean

相關問題