SQL 排除指定多个条件的记录行

在最近的一次数据分析中,我通过一段对两个表的链接查询,返回我需要的数据。在使用过程中,我发现了其中包含了一些脏数据,需要通过一些方法清除它们。我定位了这些数据的特点,然后把他们加入到查询的条件中,希望通过查询脚本的方式,把满足这些条件的记录排除。

这些错误的数据都有以下的特点:

  • rate_type = Standard
  • client_net_cleared = 0
  • program is blank (not Null)

我开始的时候使用的是以下这样的方式,然后添加到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 = Standard, client_net_cleared = 0, program is blank (not Null).

后来修正后,正确的方式是:

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

这样就实现了需要的目标,实际上这个问题的重点还是在SQL的基础,真正理解AND和OR的计算逻辑。

猜你喜欢

转载自blog.csdn.net/londa/article/details/108666238