GROUP BY
- Purpose: Aggregates data into summary rows based on one or more columns.
- Result: Returns one row per group.
- Usage: Commonly used with aggregate functions like
SUM(),COUNT(),AVG(), etc.
| Category | Sales | SaleDate |
|---|---|---|
| Electronics | 100 | 2025-01-01 |
| Electronics | 200 | 2025-01-02 |
| Electronics | 150 | 2025-01-03 |
| Furniture | 300 | 2025-01-01 |
| Furniture | 100 | 2025-01-02 |
| Furniture | 400 | 2025-01-03 |
SELECT
Category,
SUM(Sales) AS TotalSales
FROM
SalesTable
GROUP BY
Category;\
Result:
| Category | TotalSales |
|---|---|
| Electronics | 450 |
| Furniture | 800 |
Visual Representation for GROUP BY:
- Electronics: 450
- Furniture: 800
PARTITION BY
- Purpose: Divides the result set into partitions (subsets) for a specific column, but it does not collapse rows like
GROUP BY. - Result: All rows are retained, and aggregate functions are applied over each partition.
- Usage: Commonly used with window functions like
ROW_NUMBER(),RANK(),SUM() OVER().
SELECT
Category,
Sales,
SUM(Sales) OVER (PARTITION BY Category ORDER BY SaleDate) AS RunningTotal
FROM
SalesTable;Result:
| Category | Sales | RunningTotal |
|---|---|---|
| Electronics | 100 | 100 |
| Electronics | 200 | 300 |
| Electronics | 150 | 450 |
| Furniture | 300 | 300 |
| Furniture | 100 | 400 |
| Furniture | 400 | 800 |
A line chart showing the running totals for each category over time:
- Electronics: 100 → 300 → 450
- Furniture: 300 → 400 → 800
Key Differences:
| Feature | GROUP BY | PARTITION BY |
|---|---|---|
| Collapses rows | Yes, groups rows into a single result row. | No, retains all rows in the result set. |
| Aggregates scope | Across groups. | Across partitions, per row. |
| Result | One row per group. | One row per original row, with partition info. |