【问题标题】:Tableau/SQL Calculated Field With Grouping带分组的 Tableau/SQL 计算字段
【发布时间】:2021-12-18 00:45:15
【问题描述】:

我有一个结构如下的表

id, event_name, event_date
| 1 | a | 1.1.2020 | 
| 2 | b | 3.2.2020 | 
| 3 | b | 3.2.2020 |
| 3 | b | 5.2.2020| 
| 1 | b | 31.12.2019 | 
| 2 | a | 5.1.2020 | 

我的目标是对 id 进行分组,然后我必须检查事件“a”的日期是否在事件“b”之前。如果是这样,我想输出 'ok' 和 'error' elsewise。

在本例中,这将导致

id, check
| 1 | error| 
| 2 | ok |  
| 3 | ok |  

是否可以在 Tableau 中使用计算字段来执行任务? SQL 也可以!

【问题讨论】:

    标签: sql group-by tableau-api


    【解决方案1】:

    您可以将此查询与 UNION 子句一起使用:

    select id, 'Error' "check" from mydata md where event_name='a' and id in 
    (select id from mydata where id=md.id and md.event_name<>event_name 
    and md.event_date > event_date) 
    union
    select id, 'Ok' "check" from mydata md where event_name='a' and id in 
    (select id from mydata where id=md.id and md.event_name<>event_name 
    and md.event_date < event_date);
    

    输出应该是:

    | ID | 'ERROR' |
    |----|---------|
    |  1 |   Error |
    |  2 |      Ok |
    

    没有出现 ID=3,因为 event_name 都是 'b'。

    【讨论】:

    • 这是一个很酷的方法!不幸的是,在我的情况下,联合运行时会非常慢
    • 您可以尝试在表上为 EVENT_NAME 和 EVENT_DATE 2 列建立索引(复合索引)吗?
    【解决方案2】:

    试试这个

       Select id, case when diff<0 then 'ok' 
       else 'error' end as status from 
       (
        Select id,
    
        max(case when event_name ='a' then event_date end) - 
        max(case when event_name='b' then event_date end)
       As diff
        From table group by id order by id) 
      
    

    【讨论】:

    • 这很聪明!如果我有 event_names a、b、c 怎么办,我必须另外检查值 b 是否在一个组中。如果不是,则输出“缺失值”,而不是错误,例如
    • 是的,在这种情况下,您必须使用 lag() or a lead() 函数,这是一个直接的用例。
    • @Himashu Ahuja 不幸的是,我不知道如何结合 lag() 或 lead() 使其工作。您可以将其添加到您的答案中吗?然后我会编辑我的问题
    猜你喜欢
    • 1970-01-01
    • 2014-05-16
    • 2020-07-09
    • 2021-10-15
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 2017-03-11
    相关资源
    最近更新 更多