2016-12-22 12 views
0

私は次のコード実行されたMySQLデータベースのテーブル(shrewd_db.threshold)を有するは値のMySQLの別の範囲と値の範囲を比較

select id_indicator, id_threshold, activation_begin_value, activation_end_value 
from shrewd_db.threshold 
where active =1 
group by id_indicator, id_threshold; 

次のように私の出力は、次のとおり

id_indicator id_threshold activation_begin_value activation_end_value 

    2    5     4     58 
    2    6     3     3 
    2    7     1     2 
    2    8     0     0 
    4    13     0    4.5 
    4    15     4.1    5.5 
    4    16    5.51     6 
    4    17    6.01    100 

各id_indicatorには4つのid_thresholdの範囲があります。

データ検証チェックのために、各インジケータid_threshold(activation_begin_valueおよびactivation_end_value)が別のしきい値に収まらないことを確認する必要があります。

id_indicator(4)は、2つのid_threshold(13,15)の値が互いに低下
id_indicator id_threshold activation_begin_value activation_end_value 


    4    13     0    4.5 
    4    15     4.1    5.5 

私の所望の出力は次のようであるべきです。あなたは出力を取得しているために - - 主にしきい値が

+0

'id_indicator(4)2つのid_threshold(13,15)の値がお互いに落ちる' =>これは意味をなさない。あなたはなぜこれらの2行だけを出力に必要とし、他の行を必要としないのかを精緻化できますか? – Utsav

+0

例IDインジケータ4の値は4.2ですが、値が4.2であることを確認する必要がある場合は、しきい値を下回って、結果がしきい値13および15に上がります。一般に、各しきい値には固有の値域が必要ですデータの妥当性チェック私はすべてのこれらの異常を見つけて、しきい値の問題を解決する必要があります – Sumon

答えて

1

を上記出力にカーソルを記述し、行ごとに比較し、私はあなたが正しい、重複してはならないというの活性化期間を意味すると思いますか?

次のように続いて、これをチェックするクエリはなります

select distinct t1.* from threshold t1, threshold t2 where 
    t1.id_indicator = t2.id_indicator and 
    t1.id_threshold <> t2.id_threshold and 
    ( t1.activation_begin_value BETWEEN t2.activation_begin_value and 
     t2.activation_end_value 
    OR t1.activation_end_value BETWEEN t2.activation_begin_value and 
     t2.activation_end_value 
    ) 

クエリは、次のスキーマを使用してテストされています

CREATE TABLE threshold 
    (`id_indicator` int, `id_threshold` int, `activation_begin_value` numeric(5,2), `activation_end_value` numeric(5,2)) 
; 

INSERT INTO threshold 
    (`id_indicator`, `id_threshold`, `activation_begin_value`, `activation_end_value`) 
VALUES 
    (2, 5, 4, 58), 
    (2, 6, 3, 3), 
    (2, 7, 1, 2), 
    (2, 8, 0, 0), 
    (4, 13, 0, 4.5), 
    (4, 15, 4.1, 5.5), 
    (4, 16, 5.51, 6), 
    (4, 17, 6.01, 100) 
; 

、以下の結果が得られます

id_indicator|id_threshold|activation_begin_value | activation_end_value 
------------|------------|-----------------------|--------------------- 
      4|   15|     4.1|     5.5 
      4|   13|      0|     4.5 
+0

実行中にエラーが発生します。 "OR"エリアのコード – Sumon

+0

ok - 正しいはずです。 –

+0

上記のコードは私に重複値を与えていません – Sumon

0

あなたの特定のクエリを重複してはならない特定

エラー

をスローしなければならないことキャブがあること - id_indicator、id_threshold、分(activation_begin_value)を選択し、 マックス(activation_end_value) from shrewd_db.threshold active = 1 グループby id_indicator、id_threshold;

これを修正して、この出力を何らかの一時テーブルで取得し、activation_begin_valueに基づいてSelf Joinを書くと、activation_end_value私はあなたの結果を得るかもしれないと思います。それは1時間の仕事だとパフォーマンスが問題でない場合はそうで

... ...

+0

データの妥当性検査とパフォーマンスのための1つのタイムコードであるため、カーソルを書く方法を教えてください。 – Sumon

関連する問題