2

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

拿这个样本数据:

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

这几乎可以通过以下方式实现(从这里适应 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

(不同之处在于 non- 的当前行NULL comm不正确)

实际上,就我而言,差异并不重要,因为我想coalesce(comm, prev_comm). 但是,这个答案仍然不够,因为在完整的数据集中,它造成了内存故障:

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

以下未完成的拉取请求prestoignore nulls直接实施;有没有办法在过渡期间完成等效的结果?

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

4

0 回答 0