How to group items into a fixed number of bucket with MS SQL Server

  • Microsoft SQL Server has the NTILE() function that allows you to set a specific number of buckets.
  • Microsoft SQL Server will allocated the number of row for each bucket.
  • See: How to group rows in fixed group size for another way, more accurate way of group items in a fixed number of bucket.

Data used

SELECT productid AS 'Product',
       name AS 'Name',
       productnumber AS 'Prod Number',
       color AS 'Color',
       listprice AS 'List Price'
FROM production.product
WHERE color IS not null
      and makeflag = 1
      and listprice > 2000
ORDER BY productnumber;
Product     Name                                               Prod Number               Color           List Price
----------- -------------------------------------------------- ------------------------- --------------- ---------------------
782         Mountain-200 Black, 38                             BK-M68B-38                Black           2294.99
783         Mountain-200 Black, 42                             BK-M68B-42                Black           2294.99
784         Mountain-200 Black, 46                             BK-M68B-46                Black           2294.99
779         Mountain-200 Silver, 38                            BK-M68S-38                Silver          2319.99
780         Mountain-200 Silver, 42                            BK-M68S-42                Silver          2319.99
781         Mountain-200 Silver, 46                            BK-M68S-46                Silver          2319.99
775         Mountain-100 Black, 38                             BK-M82B-38                Black           3374.99
776         Mountain-100 Black, 42                             BK-M82B-42                Black           3374.99
777         Mountain-100 Black, 44                             BK-M82B-44                Black           3374.99
778         Mountain-100 Black, 48                             BK-M82B-48                Black           3374.99
771         Mountain-100 Silver, 38                            BK-M82S-38                Silver          3399.99
772         Mountain-100 Silver, 42                            BK-M82S-42                Silver          3399.99
773         Mountain-100 Silver, 44                            BK-M82S-44                Silver          3399.99
774         Mountain-100 Silver, 48                            BK-M82S-48                Silver          3399.99
793         Road-250 Black, 44                                 BK-R89B-44                Black           2443.35
794         Road-250 Black, 48                                 BK-R89B-48                Black           2443.35
795         Road-250 Black, 52                                 BK-R89B-52                Black           2443.35
796         Road-250 Black, 58                                 BK-R89B-58                Black           2443.35
789         Road-250 Red, 44                                   BK-R89R-44                Red             2443.35
790         Road-250 Red, 48                                   BK-R89R-48                Red             2443.35
791         Road-250 Red, 52                                   BK-R89R-52                Red             2443.35
792         Road-250 Red, 58                                   BK-R89R-58                Red             2443.35
750         Road-150 Red, 44                                   BK-R93R-44                Red             3578.27
751         Road-150 Red, 48                                   BK-R93R-48                Red             3578.27
752         Road-150 Red, 52                                   BK-R93R-52                Red             3578.27
753         Road-150 Red, 56                                   BK-R93R-56                Red             3578.27
749         Road-150 Red, 62                                   BK-R93R-62                Red             3578.27
966         Touring-1000 Blue, 46                              BK-T79U-46                Blue            2384.07
967         Touring-1000 Blue, 50                              BK-T79U-50                Blue            2384.07
968         Touring-1000 Blue, 54                              BK-T79U-54                Blue            2384.07
969         Touring-1000 Blue, 60                              BK-T79U-60                Blue            2384.07
954         Touring-1000 Yellow, 46                            BK-T79Y-46                Yellow          2384.07
955         Touring-1000 Yellow, 50                            BK-T79Y-50                Yellow          2384.07
956         Touring-1000 Yellow, 54                            BK-T79Y-54                Yellow          2384.07
957         Touring-1000 Yellow, 60                            BK-T79Y-60                Yellow          2384.07

(35 row(s) affected)

Grouping items in 5 buckets

SELECT ntile(5) OVER(ORDER BY productnumber) AS 'Grouping',
       productid AS 'Product',
       name AS 'Name',
       productnumber AS 'Prod Number',
       color AS 'Color',
       listprice AS 'List Price'
FROM production.product
WHERE color IS not null
      and makeflag = 1
      and listprice > 2000
ORDER BY productnumber;
Grouping             Product     Name                                               Prod Number               Color           List Price
-------------------- ----------- -------------------------------------------------- ------------------------- --------------- ---------------------
1                    782         Mountain-200 Black, 38                             BK-M68B-38                Black           2294.99
1                    783         Mountain-200 Black, 42                             BK-M68B-42                Black           2294.99
1                    784         Mountain-200 Black, 46                             BK-M68B-46                Black           2294.99
1                    779         Mountain-200 Silver, 38                            BK-M68S-38                Silver          2319.99
1                    780         Mountain-200 Silver, 42                            BK-M68S-42                Silver          2319.99
1                    781         Mountain-200 Silver, 46                            BK-M68S-46                Silver          2319.99
1                    775         Mountain-100 Black, 38                             BK-M82B-38                Black           3374.99
2                    776         Mountain-100 Black, 42                             BK-M82B-42                Black           3374.99
2                    777         Mountain-100 Black, 44                             BK-M82B-44                Black           3374.99
2                    778         Mountain-100 Black, 48                             BK-M82B-48                Black           3374.99
2                    771         Mountain-100 Silver, 38                            BK-M82S-38                Silver          3399.99
2                    772         Mountain-100 Silver, 42                            BK-M82S-42                Silver          3399.99
2                    773         Mountain-100 Silver, 44                            BK-M82S-44                Silver          3399.99
2                    774         Mountain-100 Silver, 48                            BK-M82S-48                Silver          3399.99
3                    793         Road-250 Black, 44                                 BK-R89B-44                Black           2443.35
3                    794         Road-250 Black, 48                                 BK-R89B-48                Black           2443.35
3                    795         Road-250 Black, 52                                 BK-R89B-52                Black           2443.35
3                    796         Road-250 Black, 58                                 BK-R89B-58                Black           2443.35
3                    789         Road-250 Red, 44                                   BK-R89R-44                Red             2443.35
3                    790         Road-250 Red, 48                                   BK-R89R-48                Red             2443.35
3                    791         Road-250 Red, 52                                   BK-R89R-52                Red             2443.35
4                    792         Road-250 Red, 58                                   BK-R89R-58                Red             2443.35
4                    750         Road-150 Red, 44                                   BK-R93R-44                Red             3578.27
4                    751         Road-150 Red, 48                                   BK-R93R-48                Red             3578.27
4                    752         Road-150 Red, 52                                   BK-R93R-52                Red             3578.27
4                    753         Road-150 Red, 56                                   BK-R93R-56                Red             3578.27
4                    749         Road-150 Red, 62                                   BK-R93R-62                Red             3578.27
4                    966         Touring-1000 Blue, 46                              BK-T79U-46                Blue            2384.07
5                    967         Touring-1000 Blue, 50                              BK-T79U-50                Blue            2384.07
5                    968         Touring-1000 Blue, 54                              BK-T79U-54                Blue            2384.07
5                    969         Touring-1000 Blue, 60                              BK-T79U-60                Blue            2384.07
5                    954         Touring-1000 Yellow, 46                            BK-T79Y-46                Yellow          2384.07
5                    955         Touring-1000 Yellow, 50                            BK-T79Y-50                Yellow          2384.07
5                    956         Touring-1000 Yellow, 54                            BK-T79Y-54                Yellow          2384.07
5                    957         Touring-1000 Yellow, 60                            BK-T79Y-60                Yellow          2384.07

(35 row(s) affected)

Grouping items in 10 buckets

SELECT ntile(10) OVER(ORDER BY productnumber) AS 'Grouping',
       productid AS 'Product',
       name AS 'Name',
       productnumber AS 'Prod Number',
       color AS 'Color',
       listprice AS 'List Price'
FROM production.product
WHERE color IS not null
      and makeflag = 1
      and listprice > 2000
ORDER BY productnumber;
Grouping             Product     Name                                               Prod Number               Color           List Price
-------------------- ----------- -------------------------------------------------- ------------------------- --------------- ---------------------
1                    782         Mountain-200 Black, 38                             BK-M68B-38                Black           2294.99
1                    783         Mountain-200 Black, 42                             BK-M68B-42                Black           2294.99
1                    784         Mountain-200 Black, 46                             BK-M68B-46                Black           2294.99
1                    779         Mountain-200 Silver, 38                            BK-M68S-38                Silver          2319.99
2                    780         Mountain-200 Silver, 42                            BK-M68S-42                Silver          2319.99
2                    781         Mountain-200 Silver, 46                            BK-M68S-46                Silver          2319.99
2                    775         Mountain-100 Black, 38                             BK-M82B-38                Black           3374.99
2                    776         Mountain-100 Black, 42                             BK-M82B-42                Black           3374.99
3                    777         Mountain-100 Black, 44                             BK-M82B-44                Black           3374.99
3                    778         Mountain-100 Black, 48                             BK-M82B-48                Black           3374.99
3                    771         Mountain-100 Silver, 38                            BK-M82S-38                Silver          3399.99
3                    772         Mountain-100 Silver, 42                            BK-M82S-42                Silver          3399.99
4                    773         Mountain-100 Silver, 44                            BK-M82S-44                Silver          3399.99
4                    774         Mountain-100 Silver, 48                            BK-M82S-48                Silver          3399.99
4                    793         Road-250 Black, 44                                 BK-R89B-44                Black           2443.35
4                    794         Road-250 Black, 48                                 BK-R89B-48                Black           2443.35
5                    795         Road-250 Black, 52                                 BK-R89B-52                Black           2443.35
5                    796         Road-250 Black, 58                                 BK-R89B-58                Black           2443.35
5                    789         Road-250 Red, 44                                   BK-R89R-44                Red             2443.35
5                    790         Road-250 Red, 48                                   BK-R89R-48                Red             2443.35
6                    791         Road-250 Red, 52                                   BK-R89R-52                Red             2443.35
6                    792         Road-250 Red, 58                                   BK-R89R-58                Red             2443.35
6                    750         Road-150 Red, 44                                   BK-R93R-44                Red             3578.27
7                    751         Road-150 Red, 48                                   BK-R93R-48                Red             3578.27
7                    752         Road-150 Red, 52                                   BK-R93R-52                Red             3578.27
7                    753         Road-150 Red, 56                                   BK-R93R-56                Red             3578.27
8                    749         Road-150 Red, 62                                   BK-R93R-62                Red             3578.27
8                    966         Touring-1000 Blue, 46                              BK-T79U-46                Blue            2384.07
8                    967         Touring-1000 Blue, 50                              BK-T79U-50                Blue            2384.07
9                    968         Touring-1000 Blue, 54                              BK-T79U-54                Blue            2384.07
9                    969         Touring-1000 Blue, 60                              BK-T79U-60                Blue            2384.07
9                    954         Touring-1000 Yellow, 46                            BK-T79Y-46                Yellow          2384.07
10                   955         Touring-1000 Yellow, 50                            BK-T79Y-50                Yellow          2384.07
10                   956         Touring-1000 Yellow, 54                            BK-T79Y-54                Yellow          2384.07
10                   957         Touring-1000 Yellow, 60                            BK-T79Y-60                Yellow          2384.07

(35 row(s) affected)

The way Microsoft SQL Server groups rows in buckets in easier to see in the second example of 10 buckets.

  • If the number of rows is directly divisible by the number of buckets or rows modulus buckets = 0, the number of rows in each bucket will be identical.
  • If the number of rows is NOT directly divisible by the number of buckets or rows modulus buckets <> 0, SQL Server will spread the difference at the end of the table. Bucket 1 to 5 have 4 rows, and bucket 6 to 10 have only 3 rows.