mirror of
https://github.com/lancedb/lancedb.git
synced 2026-10-13 15:22:30 +00:00
Ten merges and renames, all in one direction: fewer pages, each covering a whole subject. Table absorbs schema evolution and versioning. Vector search absorbs multi-vector. Explain absorbs explain analyze. Reranking was seven pages -- an overview and six rerankers of a few dozen lines each -- and is now one. The vector index page absorbs quantization, which was only ever a parameter of it. Indexing moves to Manage, where the other catalog objects are. The operational half stays in Operate as one Indexing page, absorbing GPU indexing -- which was filed in sophon despite importing lancedb's snippets and being mostly open-source content with one Enterprise-badged section. Performance was a single page aggregating tips for four unrelated operations, which is hard to keep current. Each section now sits with the operation it is about: ingestion tips on Insert, index tips on Indexing, compaction tips on Compaction, query tips on Search. Data Types leaves Concepts. The type reference belongs in the SQL reference, which already described the same types from the query side; Table now carries a short summary that points there. The multimodal material it had absorbed is its own page again, since storing blobs is a task rather than a type definition. Query becomes Semantic Search, Branches becomes Branch, and the Enterprise Security page becomes Compliance. Redirects cover every moved URL, and 30 files were repointed at the merged anchors.
101 lines
2.7 KiB
Plaintext
101 lines
2.7 KiB
Plaintext
---
|
|
title: "Window functions"
|
|
sidebarTitle: "Window"
|
|
description: "Compute over a set of rows related to the current one, without collapsing them."
|
|
icon: chart-simple
|
|
keywords: ["window", "over", "partition by", "row_number", "rank", "lag", "lead"]
|
|
---
|
|
|
|
<Badge color="red">Enterprise</Badge> [SQL runs on a deployment.](/sql)
|
|
|
|
A window function computes across a set of rows related to the current one and
|
|
returns a value **per row**. That is the difference from
|
|
[aggregation](/sql/aggregation), which collapses the rows it covers.
|
|
|
|
```sql
|
|
SELECT
|
|
title,
|
|
score,
|
|
row_number() OVER (PARTITION BY category ORDER BY score DESC) AS rank
|
|
FROM documents
|
|
```
|
|
|
|
Every row survives; each one gains its rank within its category.
|
|
|
|
## The window {#window}
|
|
|
|
```sql
|
|
OVER (
|
|
[PARTITION BY expr [, ...]]
|
|
[ORDER BY expr [, ...]]
|
|
[ROWS | RANGE BETWEEN frame_start AND frame_end]
|
|
)
|
|
```
|
|
|
|
`PARTITION BY` splits the rows into independent groups. `ORDER BY` orders them
|
|
inside each partition -- required by the ranking functions, since a rank without
|
|
an order is meaningless. The frame clause narrows the window further, which is
|
|
how running totals and moving averages are expressed:
|
|
|
|
```sql
|
|
SELECT
|
|
created_at,
|
|
sum(amount) OVER (ORDER BY created_at ROWS UNBOUNDED PRECEDING) AS running_total,
|
|
avg(amount) OVER (ORDER BY created_at ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS trailing_7
|
|
FROM transactions
|
|
```
|
|
|
|
A `WINDOW` clause names a definition when several functions share one:
|
|
|
|
```sql
|
|
SELECT
|
|
row_number() OVER w,
|
|
lag(score) OVER w
|
|
FROM documents
|
|
WINDOW w AS (PARTITION BY category ORDER BY score DESC)
|
|
```
|
|
|
|
## The functions {#functions}
|
|
|
|
Registered in DataFusion 54.
|
|
|
|
**Ranking**
|
|
|
|
```text
|
|
row_number rank dense_rank percent_rank cume_dist ntile
|
|
```
|
|
|
|
**Offset and positional**
|
|
|
|
```text
|
|
lag lead first_value last_value nth_value
|
|
```
|
|
|
|
**Aggregates**
|
|
|
|
Any [aggregate function](/sql/aggregation#functions) used with `OVER` becomes a
|
|
window function — that is how running totals and moving averages are written.
|
|
|
|
## Deduplicating with a window {#dedup}
|
|
|
|
The common practical use: keep one row per key, chosen by some ordering. A
|
|
window ranks, and an outer query filters:
|
|
|
|
```sql
|
|
WITH ranked AS (
|
|
SELECT *, row_number() OVER (PARTITION BY doc_id ORDER BY version DESC) AS rn
|
|
FROM revisions
|
|
)
|
|
SELECT * FROM ranked WHERE rn = 1
|
|
```
|
|
|
|
The outer query is needed because a window function cannot appear in `WHERE` --
|
|
windows are computed after filtering, so the predicate would have nothing to
|
|
read.
|
|
|
|
<Note>
|
|
Window functions sort within each partition, so on a large table they are among
|
|
the more expensive things you can ask for. Filter first, and check the cost with
|
|
[Explain Analyze](/search/explain).
|
|
</Note>
|