繁体   English   中英

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

[英]SQL exclude rows matching all of multiple criteria

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

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

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

我用 CASE 语句在 SELECT 中识别了这些,但意识到要利用它,我必须做另一个表来查询这个表中的所有内容,减去根据 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
    )  
 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM