2017-01-06 2 views
1

В настоящее время у меня есть запрос, объединяющий две таблицы для создания нового для анализа. Получив некоторые смешные результаты при попытке нарисовать его для презентации, я узнал, что некоторые из них - это поддельные данные, которые никогда не были очищены. Я смог идентифицировать данные, вызывающие проблемы, и ради времени хотел бы исключить его в запросе, чтобы я мог двигаться вперед с анализом.SQL исключает строки, соответствующие всем критериям.

Это подделка данных соответствует всем этим критериям:

  • rate_type = Стандартный
  • client_net_cleared = 0
  • программа является пустым (не Null)

Я определил их в SELECT, с CASE, но понял, что для того, чтобы использовать это, мне пришлось бы делать другую таблицу, запрашивая все в этом минусе, что было определено как удовлетворяющее вышеуказанным критериям на основе statem CASE нт. Должно быть лучшее решение, чем это.

В настоящее время я пытаюсь исключить их как часть инструкции 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 = Стандартная , client_net_cleared = 0, программа bl ank (не Null).

+0

ли у попробовал вложенную таблицу, как следующее: - 'выбрать * из ( - Поместите свой запрос здесь ) а где rate_type = стандартный и client_net_cleared программы = 0 и не Null' –

+0

Вы можете 't по порядковой позиции (по крайней мере, не в sql-сервере). И если вы можете в mysql, это привычка, которую вы должны немедленно прекратить, если не раньше. –

+0

Особенно при использовании 'SELECT *'. Это делает его зависимым от порядка столбцов в инструкции 'CREATE TABLE'. У меня такое чувство, что он на самом деле группируется по всем столбцам, поэтому он должен быть просто «SELECT DISTINCT *». – Barmar

ответ

2

Правильный критерий является

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

По deMorgan's Law, это было бы эквивалентно:

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

Это как ваш запрос, за исключением уведомления, что он использует OR, не AND.

+0

Но OP заявила, что все три критерия были выполнены ... ваше второе утверждение отрицает это, поскольку нужно только приравнивать true, или я чего-то не хватает? – scsimon

+0

@scsimon Обратите внимание, что я также отрицал критерии. Это закон деМоргана: 'NOT (x AND y)' эквивалентен '(NOT x ИЛИ NOT y)' – Barmar

+0

никогда, я понимаю сейчас. спасибо за обучение – scsimon

Смежные вопросы