2016-04-15 57 views
0

我有各種信息的表和我需要選擇的值:)

1)已經cod_anag_prov = O或= 2
2具有的計數(1)> 1

然後設置一個標誌爲1爲每個單一記錄尊重點1和2並具有所有事件中的最小數量(1)。
我想用DENSE_RANK函數和由這一點:

選擇值低於另一個 - 的Oracle

SELECT PDRA, 
    COD_DISTRIBUTORE_STARGAS, 
    ANNOMESE_RIF, 
    MAX_CNT, 
    MIN(MAX_CNT) KEEP (DENSE_RANK FIRST ORDER BY MAX_CNT) OVER (PARTITION BY PDRA) OCCORRENZA_MINORE 
    FROM 
    (SELECT PDRA, 
    COD_DISTRIBUTORE_STARGAS, 
    ANNOMESE_RIF, 
    COUNT(1) AS MAX_CNT 
    FROM STM_VOLUME_AGGR 
WHERE (COD_ANAGR_PROV = 0 
    OR COD_ANAGR_PROV = 2) 
    GROUP BY PDRA, 
    COD_DISTRIBUTORE_STARGAS, 
    ANNOMESE_RIF 
HAVING COUNT(1)>1 
    ORDER BY PDRA); 



到目前爲止,(我認爲)我已經能夠做什麼,我之前說的。
現在,如果我有個結果這樣的:

34624200 1905 201305 6 6 
    34624200 83  201305 13 6 
    34624200 93  201305 14 6 
    34439201 1  201305 11 2 
    34439201 6  201305 2 2 



,我想設置標記,以1行:

34624200 1905 201305 6 6 
34439201 6  201305 2 2 



我怎麼能做到這一點? !
我知道我做的東西很複雜得多,但現在我的大腦正在融化的xD(我是相當新的SQL)...


更新1: 好,我已經做到了,但肯定我需要優化它。成本是3.300.000:S

這是我的解決方案:

SELECT PDRA, 
    COD_DISTRIBUTORE_STARGAS, 
    ANNOMESE_RIF, 
    MIN(MAX_CNT), 
    NUMERO_OCCORRENZE FROM 
(SELECT PDRA, 
    COD_DISTRIBUTORE_STARGAS, 
    ANNOMESE_RIF, 
    MAX_CNT, 
    MIN(MAX_CNT) KEEP (DENSE_RANK FIRST ORDER BY MAX_CNT) OVER (PARTITION BY PDRA) NUMERO_OCCORRENZE 
    FROM 
    (SELECT PDRA, 
    COD_DISTRIBUTORE_STARGAS, 
    ANNOMESE_RIF, 
    COUNT(1) AS MAX_CNT 
    FROM STM_VOLUME_AGGR 
WHERE (COD_ANAGR_PROV = 0 
    OR COD_ANAGR_PROV = 2) 
    GROUP BY PDRA, 
    COD_DISTRIBUTORE_STARGAS, 
    ANNOMESE_RIF 
HAVING COUNT(1)>1 
    ORDER BY PDRA)) 
    GROUP BY 
    PDRA, COD_DISTRIBUTORE_STARGAS, ANNOMESE_RIF, NUMERO_OCCORRENZE 
    HAVING MIN(MAX_CNT)=NUMERO_OCCORRENZE 
    ; 



顯然,我不知道這是最好的解決辦法(即使它的工作原理)...

+1

「flag」是什麼意思?你介意發佈樣本輸入數據,所以我們可以幫助你更好?不管 - 看起來你現在需要的只是使用一個GROUP BY子句(並且選擇max(col2),按其他列來分組)。 – mathguy

+0

另外,爲什麼你的問題中的plsql標籤和引用?這看起來像是直接的SQL。 – mathguy

+0

是的我用標籤xD犯了一個錯誤 –

回答

0

您的查詢需要簡化,但是, 快速獲勝;

SELECT PDRA, 
    COD_DISTRIBUTORE_STARGAS, 
    ANNOMESE_RIF, 
    MAX_CNT, 
    row_number() over(partititon by PDRA order by MAX_CNT) rank_id 
    FROM 
    (SELECT PDRA, 
    COD_DISTRIBUTORE_STARGAS, 
    ANNOMESE_RIF, 
    COUNT(1) AS MAX_CNT 
    FROM STM_VOLUME_AGGR 
WHERE (COD_ANAGR_PROV = 0 
    OR COD_ANAGR_PROV = 2) 
    GROUP BY PDRA, 
    COD_DISTRIBUTORE_STARGAS, 
    ANNOMESE_RIF 
HAVING COUNT(1)>1 
    ORDER BY PDRA) 
0

如果我理解這種情況,當OCCORRENZA_MINORE = MAX_CNT:

UPDATE STM_VOLUME_AGGR 
    SET flag = 1 
WHERE (PDRA, COD_DISTRIBUTORE_STARGAS, ANNOMESE_RIF) IN 
     (SELECT PDRA, COD_DISTRIBUTORE_STARGAS, ANNOMESE_RIF 
      FROM (your_query) 
     WHERE OCCORRENZA_MINORE = MAX_CNT) 
    AND (COD_ANAGR_PROV = 0 OR COD_ANAGR_PROV = 2) 
0

無論是一組由前面提到或另一列,您通過「案例」,最後兩個之間的比較填充你的查詢的列(case ...當等於1 else 0結束時)。

相關問題