2016-04-15 20 views
0

は、私は様々な情報を持つテーブルがあると私は値を選択する必要があります= 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 
    ; 


明らか
私はこれが最善の解決策は、(それが動作しても)であることを確認しないんだけど...

+1

「フラグ」とはどういう意味ですか?サンプル入力データを投稿してもらえますか?お手伝いできますか?それにもかかわらず、あなたが今必要とするのは、GROUP BY句を使用することです(他の列でグループをmax(col2)に選択してください)。 – mathguy

+0

また、なぜplsqlタグと参照があなたの質問にありますか?これはまっすぐなSQLのように思えます。 – mathguy

+0

ええ、私はタグxDで間違いを犯しました –

答えて

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) 
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) 
0

どちらかあなたが「ケース」と最後の二つの間の比較を経由して移入する前に述べたようにして、グループまたは別の列、クエリの列(大文字と小文字が等しい場合は1、それ以外の場合は0)。