sqladvanced

Window Frame ROWS vs RANGE Clauses

Control exactly which rows a window function considers using frame specifications.

sql
-- 7-day moving average using ROWS
SELECT
  date,
  daily_revenue,
  AVG(daily_revenue) OVER (
    ORDER BY date
    ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
  ) AS moving_avg_7d
FROM daily_metrics;

-- Running total with ROWS UNBOUNDED
SELECT
  month,
  revenue,
  SUM(revenue) OVER (
    ORDER BY month
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  ) AS running_total
FROM monthly_revenue;

-- RANGE: group ties together
SELECT
  employee_id,
  salary,
  COUNT(*) OVER (
    ORDER BY salary
    RANGE BETWEEN 5000 PRECEDING AND 5000 FOLLOWING
  ) AS peers_in_range
FROM employees;

Use Cases

  • Moving averages
  • Running totals
  • Range-based peer analysis

Tags

Related Snippets

Similar patterns you can reuse in the same workflow.