さまざまな情報を含むテーブルがあり、次の値を選択する必要があります
。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
;
明らかに、これが最善の解決策であるかどうかはわかりません(機能する場合でも)...