SQL Practice Logo

SQLPractice Online

Window Frame Specifications: Functions

Module: Window Functions

**Basic Frame Syntax:**

```sql

{ROWS | RANGE} BETWEEN frame_start AND frame_end

```

**Frame Boundaries:**

```sql

UNBOUNDED PRECEDING -- First row in partition

N PRECEDING -- N rows before current

CURRENT ROW -- Current row

N FOLLOWING -- N rows after current

UNBOUNDED FOLLOWING -- Last row in partition

```

**Common Patterns:**

```sql

-- Running total

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

-- Moving average (5 periods)

ROWS BETWEEN 4 PRECEDING AND CURRENT ROW

-- Centered window (3 periods)

ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING

-- Full partition

ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

```

**Shorthand Syntax:**

```sql

-- These are equivalent:

ROWS UNBOUNDED PRECEDING

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

-- These are equivalent:

ROWS 3 PRECEDING

ROWS BETWEEN 3 PRECEDING AND CURRENT ROW

```

Frame syntax: {ROWS | RANGE} BETWEEN frame_start AND frame_end

ROWS counts physical rows, RANGE groups by ORDER BY values (handles ties)

Boundaries: UNBOUNDED PRECEDING/FOLLOWING, N PRECEDING/FOLLOWING, CURRENT ROW

Default frame with ORDER BY: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

Default frame without ORDER BY: entire partition (UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)

Shorthand syntax: ROWS N PRECEDING equals ROWS BETWEEN N PRECEDING AND CURRENT ROW

Full frame support including RANGE with INTERVAL for time-based frames. Excellent optimization.

Complete frame support starting MySQL 8.0. Good performance optimization for ROWS frames.