bhylu.com

Advertisements

MySQL Window Functions

Use window functions when each original record should retain its own row beside an analytic value.

How it works

A window function calculates over a defined set of rows while preserving the individual rows. That differs from GROUP BY, which reduces rows into summaries. This example ranks part quantities and calculates a running stock total in ID order. The running frame is explicit so its meaning does not depend on the default treatment of tied ordering values. Ranking order and final display order can be different choices.

Run in a disposable MySQL lab

Use Oracle MySQL 8.4 with InnoDB, not Bhylu’s SQLite playground. The examples were reviewed on MySQL 8.4.8. XAMPP may provide MariaDB, which has different feature and collation behaviour. Check your actual server before running the script. These lessons do not require a change to Bhylu’s PHP, Apache or normal database service.

  1. On a separate lab instance, create the empty bhylu_mysql_lab schema. Stop if it already exists; do not overwrite an existing database.
  2. Select that schema and import the complete repair-parts seed once. It sets the documented session mode, utf8mb4 collation, UTC and English date-name locale.
  3. Run this lesson in a fresh copy of the seed, not after another lesson’s writes. Use the command-line client or a compatible editor. DELIMITER lines are client instructions for stored-program examples.

Download this complete lesson script. Its setup is the linked seed; review the dataset before changing it. Administrative and destructive examples are restricted to the specifically named disposable objects. Every script repeats the session settings because each new connection has its own session. No MySQL browser runner is currently available.

Example

lesson.sql

SET NAMES utf8mb4 COLLATE utf8mb4_0900_ai_ci;
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
SET SESSION time_zone = '+00:00';
SET SESSION lc_time_names = 'en_US';
SELECT id, quantity,
       DENSE_RANK() OVER (ORDER BY quantity DESC) AS stock_rank,
       SUM(quantity) OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_pieces
FROM parts
ORDER BY id;

Expected result

1 | 12 | 1 | 12
2 | 4 | 3 | 16
3 | 0 | 4 | 16
4 | 6 | 2 | 22

Each part remains visible. Dense rank orders stock from largest to smallest, while the running total follows IDs and reaches twenty-two. ROW_NUMBER, RANK and DENSE_RANK handle ties differently, so choose from the required interpretation rather than treating them as aliases. To filter a calculated window value, use another query level such as a CTE.

Use the official MySQL 8.4 reference for statement contracts and version details.

Advertisements