0

我有一个包含各种信息的表,我需要选择以下值:

1)有 cod_anag_prov = 0 或 = 2
2)有一个 count(1)>1

,然后为每个尊重的记录设置一个标志为 1点 1 和 2 并且在所有事件中具有最小计数 (1)。
我想到了使用dense_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
  ;



显然我不确定这是最好的解决方案(即使它有效)......

4

3 回答 3

0

前面提到的 group by 或另一列,您通过“case”和查询的最后两列之间的比较填充(case ... when equal then 1 else 0 end)。

于 2016-04-15T13:43:31.720 回答
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)
于 2016-04-15T13:29:47.940 回答
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)
于 2016-04-15T13:19:14.927 回答