基于Tableau自定义SQL筛选同UID同日期不同州的记录
如何用Tableau Custom SQL筛选同一UID和DOS但不同ST的记录
我来帮你解决这个Custom SQL的问题——你的需求是找出同一UID、同一DOS下存在不同ST的所有记录,先看看你原来的语句哪里出问题了,再给你两种可行的方案:
先说说你原有SQL的问题
DOS = DOS这个条件完全没有筛选作用,每一行的DOS必然等于自身,相当于没加这个条件;ST >('2')的逻辑完全错误:ST是WI、MN这类州代码字符串,和数值'2'比较没有任何业务意义,这也是语句不生效的核心原因。
正确解决方案
方案1:子查询+关联(兼容性强)
这种方法先定位出符合条件的UID+DOS组合,再取出对应的所有记录,几乎所有SQL方言都支持:
SELECT t.UID, t.ST, t.DOS FROM DATA.TABLE2 t INNER JOIN ( -- 筛选出同一UID+DOS下有多个不同ST的组合 SELECT UID, DOS FROM DATA.TABLE2 GROUP BY UID, DOS HAVING COUNT(DISTINCT ST) > 1 ) valid_pairs ON t.UID = valid_pairs.UID AND t.DOS = valid_pairs.DOS
逻辑说明:
- 子查询通过
GROUP BY UID, DOS把数据按用户+日期分组; COUNT(DISTINCT ST)统计每组内不同州的数量,大于1就说明这个组合下存在不同ST;- 最后用INNER JOIN把原表中属于这些组合的所有记录提取出来,就是你要的结果。
方案2:窗口函数(更简洁高效)
如果你的数据源支持窗口函数(比如SQL Server、PostgreSQL、BigQuery等),可以用这种无需额外关联的写法:
SELECT UID, ST, DOS FROM ( SELECT UID, ST, DOS, -- 计算当前UID+DOS分组下的不同ST数量 COUNT(DISTINCT ST) OVER (PARTITION BY UID, DOS) AS distinct_st_count FROM DATA.TABLE2 ) subquery WHERE distinct_st_count > 1
逻辑说明:
- 内层用
PARTITION BY UID, DOS把数据按用户+日期拆分成分组; COUNT(DISTINCT ST) OVER (...)计算每个分组内的不同州数量;- 外层筛选出数量大于1的行,直接得到目标记录。
示例验证
用你的输入数据测试时,两种方案都会输出:
UID ST DOS 11111 WI 1/1/2018 11111 MN 1/1/2018
完全符合你的期望输出,而UID11111的1/31/2018记录因为只有一个ST,会被自动排除。
小提醒:如果DOS字段是字符串类型,要确保日期格式完全统一(比如都是MM/DD/YYYY),否则分组会出错;如果是日期类型就无需担心这个问题。
内容的提问来源于stack exchange,提问作者Amanda
相关产品推荐
相关产品推荐

