Skip to content

Commit

Permalink
feat(duckdb): implement NthValue
Browse files Browse the repository at this point in the history
  • Loading branch information
cpcloud authored and kszucs committed May 23, 2022
1 parent 37ff328 commit 1bf2842
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
6 changes: 6 additions & 0 deletions ibis/backends/base/sql/alchemy/registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -580,6 +580,11 @@ def _string_join(t, expr):
}


def _nth_value(t, expr):
op = expr.op()
return sa.func.nth_value(t.translate(op.arg), t.translate(op.nth) + 1)


sqlalchemy_window_functions_registry = {
ops.Lag: _lag,
ops.Lead: _lead,
Expand All @@ -590,6 +595,7 @@ def _string_join(t, expr):
ops.DenseRank: unary(lambda arg: sa.func.dense_rank()),
ops.MinRank: unary(lambda arg: sa.func.rank()),
ops.PercentRank: unary(lambda arg: sa.func.percent_rank()),
ops.NthValue: _nth_value,
ops.Window: _window,
ops.CumulativeOp: _window,
ops.CumulativeMax: unary(sa.func.max),
Expand Down
17 changes: 17 additions & 0 deletions ibis/backends/tests/test_window.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,23 @@ def calc_zscore(s):
lambda t: t.float_col.transform('last'),
id='last',
),
param(
lambda t, win: t.float_col.nth(3).over(win),
lambda t: t.float_col.apply(
lambda s: pd.concat(
[
pd.Series(np.nan, index=s.index[:3], dtype="float32"),
pd.Series(
s.iloc[3],
index=s.index[3:],
dtype="float32",
),
]
)
),
id="nth",
marks=pytest.mark.notimpl(["pandas"]),
),
param(
lambda _, win: ibis.row_number().over(win),
lambda t: t.cumcount(),
Expand Down

0 comments on commit 1bf2842

Please sign in to comment.