【问题标题】:Normalize a series by first value in Tableau在 Tableau 中按第一个值规范化系列
【发布时间】:2021-06-29 16:36:30
【问题描述】:

我想通过第一个值对 Tableau 中的数据系列进行标准化。

如果我的输入表是:

日期 |金额
1/1   $100
1/2   $150
1/3   $250

我想创建(并绘制)标准化值:

日期 |金额标准
1/1   1
1/2   1.5
1/3   2.5

在 SQL 中这是

SELECT date, amount / ( SELECT amount 
                        FROM table 
                        WHERE date = ( SELECT MIN(date) FROM table ) ) AS amount_norm
FROM table

理想情况下,amount_norm 应该随着用户更改 Tableau 仪表板筛选器中选定的时间间隔而更新。

看起来很简单,但我对 Tableau 语法完全不熟悉。我试过玩FIRST() = 0,但我真的不知道我在做什么。

我找到了similar question,但这并没有让我到达我想要的地方。

任何帮助将不胜感激!

【问题讨论】:

  • 是第一个值还是最小值?
  • 第一个值,也就是最短日期的值。

标签: sql time-series tableau-api division normalize


【解决方案1】:

要匹配SQL代码逻辑:

    SUM([Amount])
    /
   SUM({FIXED : SUM(IF [Date] = {FIXED : MIN([Date])} THEN ([Amount]) END)})

如果您希望它遵守工作簿/仪表板中的过滤器,您可以在冒号之前添加您要过滤的维度,如下所示:

    SUM([Amount])
    /
   SUM({FIXED [filter dimension] : SUM(IF [Date] = {FIXED : MIN([Date])} THEN ([Amount]) END)})

要为固定 LOD 表达式添加更多条件,您可以添加一个逗号,然后添加另一个维度。

【讨论】:

  • 谢谢——这看起来很接近。我首先尝试了您更简单的方法:SUM([amount]) / SUM(IF [date] = {FIXED : MIN([date])} THEN [amount] END)。我看到第一个值是 1,其余的都是空值。似乎IF 条件仅计算第一个日期的标准化金额。我们是否需要在某处使用ELSE 来计算其他日期的商?不知道该怎么做。
  • 我添加了一些逻辑。我不得不修复更多的细节层次,然后聚合它。我没有看就做了第一个,但是我测试了这个。如果它不起作用,请告诉我!
  • 谢谢!这解决了空值问题。但是,我有多个系列,看起来分母是第一天所有金额的总和。想象一下我的输入表有几列,amount_1, amount_2, ... , amount_n。我希望每个金额列都标准化为自己的起始值。更一般地说,我认为我需要弄清楚如何自己修补并理解 Tableau 表达式。我需要相当于 Python 解释器或运行一行 SQL。出于某种原因,例如,我无法简单地确定MIN([date]) 的输出。
  • 是的,Tableau LOD 表达式可能很痛苦。您必须为每一列都有一个计算字段(更改每一列中的金额字段以匹配)。如果您想要第一天的最低金额,您可以将分母中的 SUM 更改为 MIN。但这可能不是你所追求的。如果您有一个代表第一天第一笔金额的 ID,也可以实施。
【解决方案2】:

使用表格计算而不是 LOD 计算会更简单

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2014-09-21
    • 2011-04-18
    相关资源
    最近更新 更多