在 Tableau Server 自定义中排除重复项 SQL (DB2)
Exclude Duplicates in Tableau Server Custom SQL (DB2)
我需要创建一个标志让管理人员了解系统使用情况。我们有 3 个供人们使用的主要系统,我们正试图将用户从其中一个系统中转移出来。我的查询执行此操作,但我正在查询的 table 的性质包含重复项,因为 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。
我想你想要一个相关的子查询:
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)
)
至于你的代码示例。您没有在带有 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);
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 的过滤器。我从字面上理解了 "don't post the entire code" 提示。很抱歉没有为那些试图回答的人提供足够的信息。它现在可以工作了。感谢您的回答。
我需要创建一个标志让管理人员了解系统使用情况。我们有 3 个供人们使用的主要系统,我们正试图将用户从其中一个系统中转移出来。我的查询执行此操作,但我正在查询的 table 的性质包含重复项,因为 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。
我想你想要一个相关的子查询:
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)
)
至于你的代码示例。您没有在带有 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);
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 的过滤器。我从字面上理解了 "don't post the entire code" 提示。很抱歉没有为那些试图回答的人提供足够的信息。它现在可以工作了。感谢您的回答。