Skip to content

Instantly share code, notes, and snippets.

@DominikStyp
Last active August 11, 2021 21:12
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/e265b308501926e641a0005ee0ceb690 to your computer and use it in GitHub Desktop.
Save DominikStyp/e265b308501926e641a0005ee0ceb690 to your computer and use it in GitHub Desktop.
SQL Window Functions: Find next id for every row in result set ("holes" in ids included)
USE test;
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NULL,
`manager_id` INT UNSIGNED NOT NULL,
PRIMARY KEY (`id`));
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('Dev1', '17'); -- 1
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('Dev2', '17'); -- 2
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('Dev3', '17'); -- 3
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('Dev4', '17'); -- 4
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('Dev4', '17'); -- 5
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('Dev5', '18'); -- 6
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('Dev5', '18'); -- 7
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('Dev6', '19'); -- 8
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('Dev6', '19'); -- 9
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('Dev7', '19'); -- 10
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('Dev8', '18'); -- 11
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('Marketer1', '16'); -- 12
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('Marketer2', '16'); -- 13
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('CEO', '0'); -- 14
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('Managers Director', '14'); -- 15
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('Marketing Director', '14'); -- 16
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('Manager1', '15'); -- 17
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('Manager2', '15'); -- 18
INSERT INTO `employee` (`name`, `manager_id`) VALUES ('Manager3', '15'); -- 19
DELETE FROM `employee` WHERE `id` IN (4,6,8); -- delete repeated records, make "holes" in ids
id name manager_id next_id
1 Dev1 17 2
2 Dev2 17 3
3 Dev3 17 5
5 Dev4 17 7
7 Dev5 18 9
9 Dev6 19 10
10 Dev7 19 11
11 Dev8 18 12
12 Marketer1 16 13
13 Marketer2 16 14
14 CEO 0 15
15 Managers Director 14 16
16 Marketing Director 14 17
17 Manager1 15 18
18 Manager2 15 19
19 Manager3 15 NULL
USE test;
SELECT id, name, manager_id,
LEAD(id) OVER(ORDER BY id ASC RANGE BETWEEN CURRENT ROW AND 2 FOLLOWING) as next_id
FROM employee
ORDER BY id ASC
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment