2017-01-06 3 views
1

J'ai actuellement une requête fusionnant deux tables pour en créer une nouvelle pour l'analyse. Après avoir obtenu des résultats amusants en essayant de le représenter pour la présentation, j'ai appris que certaines de ces données n'étaient jamais nettoyées. J'ai été en mesure d'identifier les données à l'origine des problèmes et, pour le temps, je voudrais les exclure de la requête afin que je puisse aller de l'avant avec l'analyse.SQL exclut les lignes correspondant à tous les critères

Ces données faux correspond à tous ces critères:

  • rate_type = standard
  • client_net_cleared = 0
  • programme
  • est vide (non nul)

j'ai identifié ces derniers dans SELECT avec CASE, mais je me suis rendu compte que pour en faire un usage, je devrais faire une autre table en interrogeant tout ce qui est dans ce document moins ce qui est identifié comme répondant aux critères ci-dessus basés sur l'état CASE NT. Il doit y avoir une meilleure solution que cela.

Je suis actuellement en train d'essayer d'exclure ceux-ci dans le cadre de l'instruction WHERE, mais j'ai lu d'autres sujets de questions et trouvé O WH n'est pas très bon pour gérer plusieurs sous-conditions.

Ce que j'ai:

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 

ensemble de données de l'échantillon:

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 

Ce que je dois:

Ne comptez pas les lignes correspondant à trois critères: rate_type = standard , client_net_cleared = 0, le programme est bl ank (pas nul).

+0

u essayé le at table imbriquée, comme la suivante: - 'select * from ( - Mettez votre requête ici ) où un rate_type = Standard and client_net_cleared = 0 et le programme ne sont pas null' –

+0

Vous pouvez 't grouper par position ordinale (au moins pas dans sql-server). Et si vous pouvez mysql c'est une habitude que vous devriez arrêter immédiatement si pas plus tôt. –

+0

Surtout lorsque vous utilisez 'SELECT *'. Cela le rend dépendant de l'ordre des colonnes dans l'instruction 'CREATE TABLE'. J'ai le sentiment qu'il est en train de se grouper par toutes les colonnes, donc ça devrait juste être "SELECT DISTINCT *". – Barmar

Répondre

2

Les critères corrects est

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

Par deMorgan's Law, cela équivaudrait à:

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

Cela ressemble à votre requête, sauf avis qu'il utilise OR, pas AND.

+0

Mais OP a déclaré que les trois critères étaient remplis ... votre deuxième affirmation contredit cela, car il suffit d'un seul équivoque pour dire vrai, ou ai-je oublié quelque chose? – scsimon

+0

@scsimon Notez que j'ai également annulé les critères. C'est la loi de DeMorgan: 'NOT (x AND y)' est équivalent à '(NOT x OU NOT y)' – Barmar

+0

rien, je comprends maintenant. merci pour la scolarité – scsimon