は、私は様々な情報を持つテーブルがあると私は値を選択する必要があります= 0または= 2
2をcod_anag_provいる
1))は、カウント(1)を持っています> 1
を設定し、ポイント1とポイント2を尊重し、すべての出現の中で最小のカウント(1)を持つ各レコードごとにフラグを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にかなり新しいです)何かをやった知っている...
UPDATE 1: 私はそれをやった[OK]を、しかし確実に私はそれを最適化する必要があります。コストは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
;
明らか
私はこれが最善の解決策は、(それが動作しても)であることを確認しないんだけど...
「フラグ」とはどういう意味ですか?サンプル入力データを投稿してもらえますか?お手伝いできますか?それにもかかわらず、あなたが今必要とするのは、GROUP BY句を使用することです(他の列でグループをmax(col2)に選択してください)。 – mathguy
また、なぜplsqlタグと参照があなたの質問にありますか?これはまっすぐなSQLのように思えます。 – mathguy
ええ、私はタグxDで間違いを犯しました –