我有各种信息的表和我需要选择的值:)
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犯了一个错误 –