上次观察结转/忽略滞后

时间:2017-12-19 11:31:59

标签: mysql sql presto locf

如何在Presto中模仿由lag(x) ignore nulls引起的LOCF行为,例如Redshift?

获取此样本数据:

select * from (
  values (7369, null), (7499, 300), (7521, 500),
         (7566, null), (7654, 1400), (7698, null),
         (7782, null), (7788, null), (7839, null),
         (7844, 0), (7876, null), (7900, null),
         (7902, null), (7934, null)
) ex(empno, comm)

-- empno    comm
--  7369    
--  7499    300
--  7521    500
--  7566    
--  7654    1400
--  7698    
--  7782    
--  7788    
--  7839    
--  7844    0
--  7876    
--  7900    
--  7902    
--  7934    

所需的输出是:

-- empno    comm     prev_comm
--  7369        
--  7499    300         
--  7521    500      300
--  7566             500
--  7654    1400     500
--  7698            1400
--  7782            1400
--  7788            1400
--  7839            1400
--  7844    0       1400
--  7876               0
--  7900               0
--  7902               0
--  7934               0

这几乎可以通过以下方式实现(适用于来自here的Presto):

select empno, comm, max(comm) over (partition by grp) prev_comm
from ( 
  select empno, comm, sum(cast(comm is not null as double)) over (order by empno) grp
  from example_table
)
order by empno

-- empno    comm     prev_comm
--  7369        
--  7499    300      300
--  7521    500      500
--  7566             500
--  7654    1400    1400
--  7698            1400
--  7782            1400
--  7788            1400
--  7839            1400
--  7844    0          0
--  7876               0
--  7900               0
--  7902               0
--  7934               0

(区别在于非NULL comm的当前行不正确)

实际上,在我的情况下,差异并不重要,因为我想要coalesce(comm, prev_comm)。但是,这个答案仍然不够,因为在完整的数据集中,它创建了一个内存故障:

  

查询超出本地内存限制20GB

以下针对presto的未完成拉取请求将直接实施ignore nulls;是否有办法在临时中完成相同的结果?

https://github.com/prestodb/presto/pull/6157

0 个答案:

没有答案