我有各種信息的表和我需要選擇的值:)
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
;
顯然,我不知道這是最好的解決辦法(即使它的工作原理)...
「flag」是什麼意思?你介意發佈樣本輸入數據,所以我們可以幫助你更好?不管 - 看起來你現在需要的只是使用一個GROUP BY子句(並且選擇max(col2),按其他列來分組)。 – mathguy
另外,爲什麼你的問題中的plsql標籤和引用?這看起來像是直接的SQL。 – mathguy
是的我用標籤xD犯了一個錯誤 –