SQL排除与所有多个条件匹配的行



我目前有一个查询,它合并了两个表来创建一个新表进行分析。在尝试绘制图表进行演示时得到了一些有趣的结果后,我了解到其中一些是从未清理过的虚假数据。我已经能够识别出导致问题的数据,为了时间起见,我想将其排除在查询中,以便继续进行分析。

这些虚假数据符合所有这些标准:

  • rate_type=标准
  • client_net_cleared=0
  • 程序为空(不为Null)

我在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,program为空(非Null)。

正确的标准是

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

根据德摩根定律,这相当于:

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

这与您的查询类似,只是注意它使用的是OR,而不是AND

您也可以在WHERE子句中执行SELECT以使用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
)  

相关内容

  • 没有找到相关文章

最新更新