将当前行值与配置单元sql或表中所有上一行值进行比较

2lpgd968  于 2021-06-24  发布在  Hive
关注(0)|答案(3)|浏览(341)

我想将当前行的值与tableau或sql中以前的所有值进行比较。下面是我想要的一个例子。

所以像可乐第2行,我想比较它与第1行,如果它大于。对于第2行,我想将其与第2行和第3行进行比较。这将一直持续下去,直到它到达分区的末尾。然后输出只是计算有多少场景是真的(如表的右侧所示)。
有人知道如何在tableau或hivesql中实现这一点的语法吗?我已经研究了hivesql中的lag()函数以及tableau中的window\u sum()函数。
我可以选择在hive中创建一个udf,但是我不太熟悉这个概念,也不太熟悉语法。
谢谢你的帮助。

ego6inou

ego6inou1#

为了让你的问题有意义,你需要一个列来指定顺序。我假设第一列是 id 包含此信息的列。
一般来说,这在sql中是一个挑战。在配置单元中应该使用的一种方法是交叉连接和聚合。

select t.id, t.colA,
       sum(case when t2.id < t.id and t2.colA < t.colA then 1 else 0 end)
from t cross join
     t t2
group by t.id, t.colA;

注意:即使在中等尺寸的table上也不会有好的性能。

nvbavucw

nvbavucw2#

当数据值的顺序影响计算时,作为tableau客户端,您有两个选择。
使用自定义sql编写依赖于行顺序的查询,例如使用over和partition关键字编写支持窗口查询的更高版本的sql。这种方法在数据库服务器上执行特定于订单的计算。
使用tableau table calcs编写一个计算,遍历(聚合)查询结果来计算所需的值。TableCalc是tableau中唯一(至少4种)可以比较不同行之间值的计算类型。其他类型的tableau查询(记录级计算、聚合计算和lod计算)非常有用,但不能根据不同行的顺序执行任何操作。
这两种方法都很有用。两者都有自己的怪癖和复杂性。在所有条件相同的情况下,表格计算更灵活,所以我会先尝试这些。要认识到,除了公式之外,表calc还由有关如何遍历查询结果集的信息(称为分区和寻址)指定。有关表格计算,请参阅联机帮助。
但是,由于表计算是在客户端实现的,因此当您有非常大的数据集时,它们不是最佳选择,否则就不需要提取到客户端。当驱动计算的信息已经从客户端(比如聚合查询结果)获取时,它们是一个很好的选择。

gkl3eglg

gkl3eglg3#

试试这个:
哪里 gs_test 你的输入表 cola

select 
    cola, 
    row_num, 
    sum(if(cola>next_el_, 1, 0)) as countOfTrueBefore 
from 
    (
    select 
        cola, 
        row_num, 
        collect_set(cola) over (order by row_num asc rows between 1 following and unbounded following) as next_el 
    from 
        (
        select 
            cola, 
            sum(1) over (rows between unbounded preceding and current row) as row_num 
        from 
            gs_test
        ) main_inner
    ) main 
lateral view outer explode(next_el) ne as next_el_ group by cola, row_num;

结果:
cola-原始列
row_num—倒数行号(第一行是最后一行)
countoftruebefore-按照你的逻辑

MapReduce Jobs Launched:
Stage-Stage-1: Map: 1  Reduce: 1   Cumulative CPU: 6.91 sec   HDFS Read: 7690 HDFS Write: 278 SUCCESS
Stage-Stage-2: Map: 1  Reduce: 1   Cumulative CPU: 7.2 sec   HDFS Read: 8314 HDFS Write: 285 SUCCESS
Stage-Stage-3: Map: 1  Reduce: 1   Cumulative CPU: 5.34 sec   HDFS Read: 5586 HDFS Write: 63 SUCCESS
Total MapReduce CPU Time Spent: 19 seconds 450 msec
OK
0.01    5       0
0.33    1       1
0.47    6       0
0.48    2       2
0.75    4       2
0.85    7       0
0.88    3       4

相关问题