繁体   English   中英

选择低于另一个值的值-Oracle

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM