我想将当前行的值与tableau或sql中以前的所有值进行比较。下面是我想要的一个例子。
所以像可乐第2行,我想比较它与第1行,如果它大于。对于第2行,我想将其与第2行和第3行进行比较。这将一直持续下去,直到它到达分区的末尾。然后输出只是计算有多少场景是真的(如表的右侧所示)。
有人知道如何在tableau或hivesql中实现这一点的语法吗?我已经研究了hivesql中的lag()函数以及tableau中的window\u sum()函数。
我可以选择在hive中创建一个udf,但是我不太熟悉这个概念,也不太熟悉语法。
谢谢你的帮助。
3条答案
按热度按时间ego6inou1#
为了让你的问题有意义,你需要一个列来指定顺序。我假设第一列是
id
包含此信息的列。一般来说,这在sql中是一个挑战。在配置单元中应该使用的一种方法是交叉连接和聚合。
注意:即使在中等尺寸的table上也不会有好的性能。
nvbavucw2#
当数据值的顺序影响计算时,作为tableau客户端,您有两个选择。
使用自定义sql编写依赖于行顺序的查询,例如使用over和partition关键字编写支持窗口查询的更高版本的sql。这种方法在数据库服务器上执行特定于订单的计算。
使用tableau table calcs编写一个计算,遍历(聚合)查询结果来计算所需的值。TableCalc是tableau中唯一(至少4种)可以比较不同行之间值的计算类型。其他类型的tableau查询(记录级计算、聚合计算和lod计算)非常有用,但不能根据不同行的顺序执行任何操作。
这两种方法都很有用。两者都有自己的怪癖和复杂性。在所有条件相同的情况下,表格计算更灵活,所以我会先尝试这些。要认识到,除了公式之外,表calc还由有关如何遍历查询结果集的信息(称为分区和寻址)指定。有关表格计算,请参阅联机帮助。
但是,由于表计算是在客户端实现的,因此当您有非常大的数据集时,它们不是最佳选择,否则就不需要提取到客户端。当驱动计算的信息已经从客户端(比如聚合查询结果)获取时,它们是一个很好的选择。
gkl3eglg3#
试试这个:
哪里
gs_test
你的输入表cola
柱结果:
cola-原始列
row_num—倒数行号(第一行是最后一行)
countoftruebefore-按照你的逻辑