You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

逻辑说明:

  1. 子查询通过GROUP BY UID, DOS把数据按用户+日期分组;
  2. COUNT(DISTINCT ST)统计每组内不同州的数量,大于1就说明这个组合下存在不同ST;
  3. 最后用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

逻辑说明:

  1. 内层用PARTITION BY UID, DOS把数据按用户+日期拆分成分组;
  2. COUNT(DISTINCT ST) OVER (...)计算每个分组内的不同州数量;
  3. 外层筛选出数量大于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:14:51