如何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 的本地内存限制
以下未完成的拉取请求presto
将ignore nulls
直接实施;有没有办法在过渡期间完成等效的结果?