SQL 排除指定多个条件的记录行
原创
©著作权归作者所有:来自51CTO博客作者AllenLeungX的原创作品,请联系作者获取转载授权,否则将追究法律责任
在最近的一次数据分析中,我通过一段对两个表的链接查询,返回我需要的数据。在使用过程中,我发现了其中包含了一些脏数据,需要通过一些方法清除它们。我定位了这些数据的特点,然后把他们加入到查询的条件中,希望通过查询脚本的方式,把满足这些条件的记录排除。
这些错误的数据都有以下的特点:
- 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的计算逻辑。