【问题标题】:Exclude Duplicates in Tableau Server Custom SQL (DB2)在 Tableau Server 自定义 SQL (DB2) 中排除重复项
【发布时间】:2019-03-24 16:43:53
【问题描述】:

我需要创建一个标志,让管理人员了解系统使用情况。我们有 3 个人们工作的主要系统,我们正试图将用户从其中一个转换出来。我的查询执行此操作,但我查询的表的性质包括重复项,因为 CREATE_USER_CD 字段不是不同的。它针对与订单关联的每个事件类型重复(每个 FROM_ID)。

我已尝试将此作为条件添加,以仅包含最后一个触发我正在寻找的事件 TYPE_ID 的用户:

    and e.MISC_EVENT_ID in (select max(MISC_EVENT_ID) 

    from VASDW.MISC_EVENT 

    where date(CREATE_TS) between '2019-01-01 and current date

    group by FROM_ID)

这是脚本的主旨:

select e.CREATE_TS, e.MISC_EVENT_ID, e.CREATE_USER_CD, e.FROM_ID,

(case when upper(e.CREATE_USER_CD) <> e.CREATE_USER_CD

and trim(e.CREATE_USER_CD) <> 'jboss' 

and trim(e.CREATE_USER_CD) <> 'MTier'

and trim(e.CREATE_USER_CD) <> 'wlsedi' 

and trim(e.CREATE_USER_CD) <> 'svrcflp' then 1 else 0 end) 

as CLG_FG

from VASDW.MISC_EVENT e

where date(e.CREATE_TS) between '2019-01-01' and current date

当我添加上述条件时,我希望获得创建我正在寻找的事件类型的最后一个用户的 MISC_EVENT_ID。但是,我得到了重复。

CREATE_TS          MISC_EVENT_ID CREATE_USER_CD FROM_ID  CLG_FG
2019-03-20 14:00    1236064301    Sego, Jona    15293831     1
2019-03-21 10:48    1236092481    Barnes, Ja    15293831     1

除了将其写为 CTE 以提供帮助之外,还有什么想法吗?我无法编写 CTE,因为我将此自定义 SQL 用作更大的 Tableau Server 工作簿的一部分。我的计数是正确的,因为我在 Tableau 中使用 countd(),但是当您进行提取时会出现重复项。不久就会有人质疑这个问题,所以我试图完全避免它。

TIA。

【问题讨论】:

    标签: sql db2 tableau-api


    【解决方案1】:

    至于您的代码示例。您不会在带有group by 的子选择的where 子句中包含相同的case 表达式。 按原样运行。
    您是否得到以下数据的预期结果(仅第 2 行)?

    with "VASDW.MISC_EVENT" 
    (CREATE_TS, MISC_EVENT_ID, CREATE_USER_CD, FROM_ID, TYPE_ID, FROM_CLASS_ID) as (values
      (timestamp('2019-03-20-14.00.00'), 1236064301, 'Sego, Jona', 15293831, 1852, 32)
    , (timestamp('2019-03-21-10.48.00'), 1236092481, 'Barnes, Ja', 15293831, 1852, 32)
    , (timestamp('2019-03-20-14.00.00'), 2236064301, 'Sego, Jona', 15293832, 1852, 32)
    , (timestamp('2019-03-21-10.48.00'), 2236092481, 'BARNES, JA', 15293832, 1852, 32)
    )
    select e.FROM_ID, e.CREATE_USER_CD, e.MISC_EVENT_ID,
    (case when upper(e.CREATE_USER_CD) <> e.CREATE_USER_CD
        and trim(e.CREATE_USER_CD) <> 'jboss' 
        and trim(e.CREATE_USER_CD) <> 'MTier'
        and trim(e.CREATE_USER_CD) <> 'wlsedi' 
        and trim(e.CREATE_USER_CD) <> 'svrcflp' then 1 else 0 end) as CLG_FG
    from "VASDW.MISC_EVENT" e
        where date(e.CREATE_TS) between '2019-01-01' and current date
        and e.TYPE_ID = 1852
        and e.FROM_CLASS_ID = 32 
        and (case when upper(e.CREATE_USER_CD) <> e.CREATE_USER_CD
            and trim(e.CREATE_USER_CD) <> 'jboss' 
            and trim(e.CREATE_USER_CD) <> 'MTier'
            and trim(e.CREATE_USER_CD) <> 'wlsedi' 
            and trim(e.CREATE_USER_CD) <> 'svrcflp' then 1 else 0 end = 1)
        and e.MISC_EVENT_ID in (
            select max(e2.MISC_EVENT_ID) 
            from "VASDW.MISC_EVENT" e2 
                where e2.TYPE_ID = 1852
                and e2.FROM_CLASS_ID = 32
                and date(e2.CREATE_TS) between '2019-01-01' and current date
        group by e2.FROM_ID);
    

    【讨论】:

    • 谢谢,Mark,但这是 Tableau Server 的自定义 SQL,因此不能选择 CTE。对于更多背景知识,FROM_ID 基本上是一个订单号,每个名称和时间戳都与一个事件 TYPE_ID 相关联。我必须寻找一个特定的 TYPE_ID 以及与之关联的人员和时间戳,但是该事件 TYPE_ID 可以重复 - 即使是用户和 FROM_ID,所以它会变得混乱。 MISC_EVENT_ID 是唯一可用的非重复字段,这就是为什么我认为获取与 FROM_ID 关联的 max(MISC_EVENT_ID) 就可以了。
    • 我的示例使用 CTE 为您提供完整的解决方案,其中包含动态生成的测试数据。在你的情况下你不需要它。您的示例中没有关于 TYPE_ID 的内容。您能否以表格形式提供您的测试数据和所需的结果?从上面这样的解释中很难理解你需要什么......
    • 我在这里格式化很糟糕,对不起。我需要表中的某个 TYPE_ID,以便过滤掉所有其他不适用于此 CLG_FG 别名的事件类型。 MISC_EVENT_ID 是这个表的 PK,所以我的想法是我会找到满足我的 TYPE_ID 条件的每个 FROM_ID 的 max(MISC_EVENT_ID)。但我仍然得到重复。
    • 感谢您指出我在原始帖子中未提供的信息,让我重新指向正确的方向,马克。当我输入回复时,我找到了解决方案。
    【解决方案2】:

    我认为你想要一个相关的子查询:

    e.MISC_EVENT_ID = (select max(me2.MISC_EVENT_ID) 
    
                       from VASDW.MISC_EVENT me2
                       where me2.FROM_ID = me.FROM_ID and
    
                             me2.CREATE_TS >= '2019-01-01 and
                             me2.CREATE_TS < add_days(current date, 1)
                     )
    

    【讨论】:

    • 谢谢戈登。我之前尝试了自加入,但没有成功,但子查询可能会解决这个问题。我会试一试,报告回来。不过,从今天下午开始,我就一直在用头撞墙。所以可能要到明天。
    【解决方案3】:
    select e.FROM_ID, e.CREATE_USER_CD, e.MISC_EVENT_ID,
    (case when upper(e.CREATE_USER_CD) <> e.CREATE_USER_CD
        and trim(e.CREATE_USER_CD) <> 'jboss' 
        and trim(e.CREATE_USER_CD) <> 'MTier'
        and trim(e.CREATE_USER_CD) <> 'wlsedi' 
        and trim(e.CREATE_USER_CD) <> 'svrcflp' then 1 else 0 end) as CLG_FG
    from VASDW.MISC_EVENT e
        where date(e.CREATE_TS) between '2019-01-01' and current date
        and e.TYPE_ID = 1852
        and e.FROM_CLASS_ID = 32 
        and (case when upper(e.CREATE_USER_CD) <> e.CREATE_USER_CD
            and trim(e.CREATE_USER_CD) <> 'jboss' 
            and trim(e.CREATE_USER_CD) <> 'MTier'
            and trim(e.CREATE_USER_CD) <> 'wlsedi' 
            and trim(e.CREATE_USER_CD) <> 'svrcflp' then 1 else 0 end = 1)
        and e.MISC_EVENT_ID in (
            select max(e2.MISC_EVENT_ID) 
            from VASDW.MISC_EVENT e2 
                where e2.TYPE_ID = 1852
                and e2.FROM_CLASS_ID = 32
                and date(e2.CREATE_TS) between '2019-01-01' and current date
        group by e2.FROM_ID)
    

    我猜它不起作用,因为我没有在子查询中包含我的 TYPE_ID 和 FROM_CLASS_ID 过滤器。我从字面上理解了“不要发布整个代码”的提示。很抱歉没有为那些试图回答的人提供足够的信息。它现在可以工作了。感谢您的回答。

    【讨论】:

    • 查看我更新后的答案,并对结果提出问题。
    • 我在没有向我的子查询添加案例过滤器的情况下运行了这个,并且只返回了第 2 行,这是可以预期的,因为与 FROM_ID 15293832 关联的 max(MISC_EVENT_ID) 有一个不符合我的 CREATE_USER_CD标志的标准。如果我从我的案例语句中添加过滤器,结果相同。它应该是这样工作的吗?
    • 另外,我从来没有想过要创建一个 CTE 来测试查询,所以谢谢。
    • 业务逻辑的一些背景知识:我需要标记用户从哪个系统发出订单。不过,我们尚未从新的运营商潜在客户生成 (CLG) 系统备份数据,因此开发人员将 (CREATE_USER_CD 像 '%,%' 的情况) - 'FirstName, LastName' - 作为要使用的标志。不过,这并不能解释更长的名称,因此它对于报告来说不够健壮。您还可以看到来自不同来源的服务器名称“jboss”或类似 JSEGO 的名称。所以我需要在周五即时创造一些东西。这就是我发布的内容。
    • 因此,从该 CLG 系统提交订单的任何用户都将在此事件表中显示为“姓氏,名字”。它们将永远是字母大小写。我只需要一个与某人的姓氏长度无关的标志,因为我们的 VASDW.MISC_EVENT 表将 CREATE_USER_CD 存储为 char(10)。因此,对于像“Greensleeves”这样的姓氏,它在 CREATE_USER_CD 字段中存储为“Greensleev”,即使我可以查看它并知道它来自 CLG,它也不符合 '%,%' 标准。
    猜你喜欢
    • 2018-12-11
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多