【发布时间】:2017-05-21 15:52:07
【问题描述】:
我目前有一个合并两个表以创建一个新表进行分析的查询。在尝试绘制图表以进行演示时得到一些有趣的结果后,我了解到其中一些是从未清理过的假数据。我已经能够识别出导致问题的数据,并且为了节省时间,我希望将其排除在查询中,以便继续进行分析。
这个假数据符合所有这些条件:
- 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)。
【问题讨论】:
-
你试过嵌套表吗,比如下一个:-
select * from ( -- Put your query here ) a where rate_type = Standard and client_net_cleared = 0 and program is not Null -
您不能按序号位置分组(至少不能在 sql-server 中)。如果你可以在 mysql 中,这是一个习惯,你应该立即停止。
-
尤其是在使用
SELECT *时。这使得它依赖于CREATE TABLE语句中列的顺序。我感觉他实际上是按所有列分组的,所以应该只是SELECT DISTINCT *。 -
@SeanLange 有什么更好的分组方式?如果有的话,我很乐意使用更短或更灵活的分组方式!
-
更好的方法是命名列。如果您更改表(或天堂禁止实际命名列而不是使用 *)并且您按序号位置分组,则您的查询被破坏。修复它变成了一场噩梦。
标签: mysql sql-server where-in multiple-conditions navicat