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

前述のようにグループ化するか、「ケース」を介して入力する別の列と、クエリの最後の 2 つの列を比較します (ケース ... 等しい場合は 1、そうでない場合は 0 終了)。

于 2016-04-15T13:43:31.720 に答える
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 に答える
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 に答える