[英]Select values lower than another one - Oracle
我有一个包含各种信息的表,我需要选择以下值:
1)的cod_anag_prov = 0或= 2
2)计数(1)> 1
然后为所有涉及点1和2且所有事件中具有最小count(1)的单个记录将标志设置为1。
我想到了使用density_rank函数,并弥补了这一点:
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
;
显然,我不确定这是否是最好的解决方案(即使它可以工作)...
您的查询需要简化,但是快速取胜是;
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)
如果我理解这种情况,当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)
如前所述是group by,也可以是另一列,您可以通过“ case”和查询的最后两列之间的比较进行填充(case ...等于1,否则0结束)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.