sql >> データベース >  >> RDS >> Oracle

Oracle SQLの不一致:COUNT(*)と実際の結果セット

    SELECT
        a.e_id,
        coalesce(attempts, 0) attempts,
        coalesce(successes, 0) successes,
        coalesce(failures, 0) failures
    FROM
        (
            SELECT e_id, count(*) as attempts FROM e_table
            WHERE e_comment LIKE '%attempt%' AND e_date BETWEEN '23-MAY-2016' AND '26-MAY-2016'
            GROUP BY e_id
        ) a
        full outer join
        (
            SELECT e_id, count(*) as successes FROM e_table
            WHERE e_comment LIKE '%success%' AND e_date BETWEEN '23-MAY-2016' AND '26-MAY-2016'
            GROUP BY e_id
        ) s
            on s.e_id = a.e_id
        full outer join
        (
            SELECT e_id, count(*) as failures FROM e_table
            WHERE e_comment LIKE '%failure%' AND e_date BETWEEN '23-MAY-2016' AND '26-MAY-2016'
            GROUP BY e_id
        ) f
            on f.e_id = coalesce(a.e_id, s.e_id)
    WHERE
        coalesce(attempts, 0) <> coalesce(successes, 0) + coalesce(failures, 0)
    

    完全外部結合に変更したので、マッチングを試みなくても成功や失敗がないことを確認できます。これにより、e_idを見つけることができます。 ■ロギングで問題が発生している場所。 ID値のリストだけでなく、より細かい数値の処理を開始する方が簡単なはずです。

    同じIDで複数回試行される可能性があることを指摘する人もいますが、ある種の再試行シナリオで言うのと同じ方法で、成功と失敗の両方を記録できると考えられますか?完全なコメントがどのように見えるかはわかりません。考えられる説明として、1つのコメントに「試行」、「成功」、「失敗」という単語を複数含めることができますか?

    他に考慮すべき点があります: すべての成功イベントと失敗イベントが同じ日付ウィンドウ内に収まると確信していますか?言い換えれば、試行後の遅延はありますか?これが真夜中頃に起こった場合、それほど長くする必要はないかもしれません。これを補うのに十分な成功と失敗の範囲を広げたいと思うかもしれません(そして左外部結合に変更します)。

    注: whereの条件 句が変更され、複数回の試行が可能になり(コメントに記載されているように)、試行回数と成功および失敗のバランスを探すだけになりました。



    1. Ubuntu16.04にアップグレードされました。MySQL-Pythonの依存関係が壊れています

    2. 日付の変換とカルチャ:DATEとDATETIMEの違い

    3. データベースメールアカウントをプロファイルに追加する(T-SQL)

    4. PostgreSQLデータベースのデプロイメントを自動化する方法