2017-01-06 12 views
1

私は現在、2つのテーブルをマージして新しいテーブルを作成して分析しています。プレゼンテーションのためにそれをグラフ化しようとしたときに面白い結果を得た後、私はそれが決してクリーンアップされなかった偽のデータであることを学びました。私は問題の原因となっているデータを特定できました。時間のために、クエリ内でデータを除外したいので、分析を進めることができます。複数の条件すべてに一致するSQL除外行

この偽のデータは、これらすべての条件と一致する:

  • rate_type =標準
  • client_net_cleared = 0
  • プログラムは

(NOT NULL)空白である私はSELECTでこれらを識別CASEステートメントに基づいて上記の基準を満たしていると特定されたものを差し引いた別のテーブルをこのテーブルから検索しなければならないことに気が付いたnt。それ以上の解決策が必要です。

私は現在、これらをWHEREステートメントの一部として除外しようとしていますが、他の質問トピックを読んで、複数のサブ条件を管理するのはあまり良くありません。

私が持っているもの

SELECT * 
, CASE WHEN tad.rate_type = 'Standard' 
    AND tad.client_net_cleared = '0' 
    AND program= '' THEN 1 
    ELSE '0' 
    END AS noise 

FROM tableau.km_tv_ad_data_import tad 
JOIN tableau.km_tv_ad_report ga 
    ON ga.session_timestamp >= tad.timestamp - INTERVAL '4 minute' 
    AND ga.session_timestamp <= tad.timestamp + INTERVAL '5 minute' 
    AND ga.session_timestamp != tad.timestamp 

WHERE tad.timestamp >= '2016-09-01' 
AND (tad.rate_type != 'Standard' 
    AND tad.client_net_cleared != '0' 
    AND tad.program != '') 

GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 

サンプルデータセット:

timestamp   | rate_type | program   | client_net_cleared | noise 
---------------------|-----------|-----------------|--------------------|------- 
2016-11-01 18:00:00 | Standard | Diving   |     50 | 0 
2016-12-01 21:00:00 | Holiday | Classic Albums |    100 | 0 
2016-11-01 09:00:00 | FireSale | Panorama  |     0 | 0 
2016-10-01 12:00:00 | Standard |     |     0 | 1 
2016-12-01 15:00:00 | Holiday | MythBusters  |    100 | 0 
2016-10-01 13:00:00 | FireSale | House   |    200 | 0 

私は必要なもの:rate_type =標準:

は、3つのすべての条件に一致する行を除外、client_net_cleared = 0、プログラムはbl ank(Nullではない)。

+0

uが次のように、ネストされたテーブルを試してみましたの: - '選択* から( - ここにあなたのクエリを入れて )rate_type =標準とclient_net_cleared = 0、プログラムはあなたができる –

+0

NULL'されていないA序数でグループ化する(少なくともSQL Serverにはない)。そして、あなたがmysqlの中でできるのであれば、早くなくてもすぐに止めるべき習慣です。 –

+0

特に 'SELECT *'を使用している場合。これは、 'CREATE TABLE'ステートメントの列の順序に依存します。私は彼が実際にすべての列でグループ化していると感じているので、SELECT DISTINCT *にする必要があります。 – Barmar

答えて

2

正しい基準はdeMorgan's Lawことで

AND NOT (tad.rate_type = 'Standard' 
     AND tad.client_net_cleared = '0' 
     AND tad.program = '') 

あり、これはと同等のようになります。

AND (tad.rate_type != 'Standard' 
    OR tad.client_net_cleared != '0' 
    OR tad.program != '') 

これは、それがORを使用することに注意してください、ないAND除いて、クエリのようなものです。

+0

しかし、OPは3つの基準がすべて満たされていると述べました...あなたの2番目のステートメントはこれを否定します。 – scsimon

+0

@scsimon私も基準を否定しました。それはdeMorganの法則です: 'NOT(xとy)'は '(NOT x OR NOT y)'と等価です。 – Barmar

+0

今、理解しています。学校に感謝 – scsimon

関連する問題