我目前有一个查询合并两个表来创建一个新的分析表。在尝试绘制图表进行演示后得到一些有趣的结果后,我了解到其中一些是从未清理过的假数据。我已经能够识别导致问题的数据,并且为了时间的推移,我希望将其排除在查询中,以便我可以继续进行分析。
这些假数据符合所有这些标准:
我在SELECT中用CASE语句识别了这些,但意识到要使用它,我必须做另一个表,查询这一个中的所有内容减去被识别为满足上述标准的内容在CASE声明中。必须有一个比这更好的解决方案。
我目前正试图将这些作为WHERE语句的一部分排除,但是阅读其他问题主题并发现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,程序为空(不是Null)。
答案 0 :(得分:8)
正确的标准是
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
。
答案 1 :(得分:0)
您还可以在WHERE子句中执行SELECT,以使用NOT IN排除行。例如,具有一个供应商的所有资格以及 not in 都排除了具有其他供应商的资格的人:
select * from qualification q
inner join certification c on c.id = q.certificationid
where c.vendorid = 3 and
employeeid not in
(
select employeeid from qualification q
inner join
certification c on c.id = q.certificationid
where c.vendorid <> 3
)