Skip to content

Instantly share code, notes, and snippets.

@DominikStyp
Last active August 10, 2021 22:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DominikStyp/b3224b6cfafcb6fd12e3a1c0b7576ed9 to your computer and use it in GitHub Desktop.
Save DominikStyp/b3224b6cfafcb6fd12e3a1c0b7576ed9 to your computer and use it in GitHub Desktop.
SQL Window Functions (MariaDB), PARTITION BY
DROP TABLE IF EXISTS `test`.`employee`;
CREATE TABLE `test`.`employee` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NULL,
`manager_id` INT UNSIGNED NOT NULL,
PRIMARY KEY (`id`));
INSERT INTO `test`.`employee` (`name`, `manager_id`) VALUES ('Dev1', '10');
INSERT INTO `test`.`employee` (`name`, `manager_id`) VALUES ('Dev2', '10');
INSERT INTO `test`.`employee` (`name`, `manager_id`) VALUES ('Dev3', '11');
INSERT INTO `test`.`employee` (`name`, `manager_id`) VALUES ('Dev4', '12');
INSERT INTO `test`.`employee` (`name`, `manager_id`) VALUES ('Marketer1', '9');
INSERT INTO `test`.`employee` (`name`, `manager_id`) VALUES ('Marketer2', '9');
INSERT INTO `test`.`employee` (`name`, `manager_id`) VALUES ('CEO', '0');
INSERT INTO `test`.`employee` (`name`, `manager_id`) VALUES ('Managers Director', '7');
INSERT INTO `test`.`employee` (`name`, `manager_id`) VALUES ('Marketing Director', '7');
INSERT INTO `test`.`employee` (`name`, `manager_id`) VALUES ('Manager1', '8');
INSERT INTO `test`.`employee` (`name`, `manager_id`) VALUES ('Manager2', '8');
INSERT INTO `test`.`employee` (`name`, `manager_id`) VALUES ('Manager3', '8');
id name manager_id people_per_manager group_manager
11 Manager2 8 3 Managers Director
12 Manager3 8 3 Managers Director
10 Manager1 8 3 Managers Director
2 Dev2 10 2 Manager1
1 Dev1 10 2 Manager1
5 Marketer1 9 2 Marketing Director
6 Marketer2 9 2 Marketing Director
9 Marketing Director 7 2 CEO
8 Managers Director 7 2 CEO
4 Dev4 12 1 Manager3
3 Dev3 11 1 Manager2
7 CEO 0 1 NULL
USE test;
SELECT id, name, manager_id,
-- here we partition by manager_id which is almost the same as GROUP BY
-- but it returns all rows not grouped
COUNT(manager_id) OVER (PARTITION BY manager_id) as people_per_manager,
(SELECT emp.name FROM employee AS emp WHERE emp.id = employee.manager_id) as group_manager
FROM employee
ORDER BY people_per_manager DESC, manager_id DESC;
@DominikStyp
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment