RANK SQL function


1. Usage of RANK_Function to show formatted average order at rank.

SQL Server Query 1

            
 WITH CustomerOrderCounts AS  
(
SELECT c.CustomerID, CompanyName, c.Country, COUNT(o.OrderID) AS TotalOrders
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID
GROUP BY c.CustomerID, CompanyName, c.Country
),
OrderRankWithinCountry AS
(
SELECT CustomerID, CompanyName, Country, TotalOrders,
RANK() OVER (PARTITION BY Country ORDER BY TotalOrders DESC) AS OrderRank
FROM CustomerOrderCounts
),
RankAnalysisWithinCountry AS
(
SELECT Country, OrderRank, MIN(TotalOrders) AS MinOrdersAtRank, MAX(TotalOrders) AS MaxOrdersAtRank,
COUNT(TotalOrders) AS NumberOfCustomersAtRank, AVG(CAST(TotalOrders AS decimal(10,2))) AS AvgOrdersAtRank
FROM OrderRankWithinCountry
GROUP BY Country, OrderRank
)
SELECT orc.CustomerID, orc.CompanyName, orc.Country, orc.TotalOrders, orc.OrderRank, rac.MinOrdersAtRank, rac.MaxOrdersAtRank, rac.NumberOfCustomersAtRank,
FORMAT(rac.AvgOrdersAtRank, 'N2') AS AvgOrdersAtRankFormatted
FROM OrderRankWithinCountry orc
JOIN RankAnalysisWithinCountry rac ON orc.Country = rac.Country AND orc.OrderRank = rac.OrderRank
ORDER BY orc.Country, orc.OrderRank, orc.TotalOrders DESC;

Create SQL query with SqlQueryBuilder 1

            
 var (sql1, parameters1) = new SqlQueryBuilder()  
.WithCTETable(new Table("CustomerOrderCounts"), new SqlQueryBuilder()
.Select()
.Columns("c.CustomerID", "c.CompanyName", "c.Country")
.Column(new COUNT(new Column("o.OrderID")), "TotalOrders")
.From("Customers", "c")
.Join(new List<IJoin>()
{
new INNERJOIN().TableName(new Table("Orders","o"))
.On(new Column("c.CustomerID").Equale(new Column("o.CustomerID")))
})
.GroupBy(new GroupBy(new Column("c.CustomerID"), new Column("CompanyName"), new Column("c.Country")))
)
.WithCTETable(new Table("OrderRankWithinCountry "), new SqlQueryBuilder()
.Select()
.Columns("CustomerID", "CompanyName", "Country", "TotalOrders")
.Column(new RANK().PARTITION_BY(new Column("Country")).ORDER_BY(new OrderBy().SetColumnDescending("TotalOrders")), "OrderRank")
.From("CustomerOrderCounts")
)
.WithCTETable(new Table("RankAnalysisWithinCountry"), new SqlQueryBuilder()
.Select()
.Columns("Country", "OrderRank")
.Column(new MIN(new Column("TotalOrders")), "MinOrdersAtRank")
.Column(new MAX(new Column("TotalOrders")), "MaxOrdersAtRank")
.Column(new COUNT(new Column("TotalOrders")), "NumberOfCustomersAtRank")
.Column(new AVG(new CAST(new Column("TotalOrders"), SqlDataType.DECIMAL, new Tuple<int, int>(10, 2))), "AvgOrdersAtRank")
.From("OrderRankWithinCountry")
.GroupBy(new GroupBy(new Column("Country"), new Column("OrderRank")))
)
.Select()
.Columns("orc.CustomerID", "orc.CompanyName", "orc.Country", "orc.TotalOrders", "orc.OrderRank", "rac.MinOrdersAtRank", "rac.MaxOrdersAtRank", "rac.NumberOfCustomersAtRank")
.Column(new FORMAT(new Column("rac.AvgOrdersAtRank"), "N2"), "AvgOrdersAtRankFormatted")
.From("OrderRankWithinCountry", "orc")
.Join(new List<IJoin>()
{
new INNERJOIN().TableName(new Table("RankAnalysisWithinCountry","rac"))
.On(new Column("orc.Country").Equale(new Column("rac.Country")))
.AND(new Column("orc.OrderRank").Equale(new Column("rac.OrderRank")))
})
.OrderBy(new OrderBy().SetColumnAscending("orc.Country")
.SetColumnAscending("orc.OrderRank")
.SetColumnDescending("orc.TotalOrders")
)
.Build();

Query build by SqlQueryBuilder 1

            
WITH CustomerOrderCounts
AS (SELECT c.CustomerID,
           c.CompanyName,
           c.Country,
           COUNT(o.OrderID) AS TotalOrders
    FROM Customers AS c
         LEFT OUTER JOIN
         Orders AS o
         ON c.CustomerID = o.CustomerID
    GROUP BY c.CustomerID, CompanyName, c.Country),
 OrderRankWithinCountry
AS (SELECT CustomerID,
           CompanyName,
           Country,
           TotalOrders,
           RANK() OVER (PARTITION BY Country ORDER BY TotalOrders DESC) AS OrderRank
    FROM CustomerOrderCounts),
 RankAnalysisWithinCountry
AS (SELECT Country,
           OrderRank,
           MIN(TotalOrders) AS MinOrdersAtRank,
           MAX(TotalOrders) AS MaxOrdersAtRank,
           COUNT(TotalOrders) AS NumberOfCustomersAtRank,
           AVG(CAST (TotalOrders AS DECIMAL (10, 2))) AS AvgOrdersAtRank
    FROM OrderRankWithinCountry
    GROUP BY Country, OrderRank)
SELECT orc.CustomerID,
       orc.CompanyName,
       orc.Country,
       orc.TotalOrders,
       orc.OrderRank,
       rac.MinOrdersAtRank,
       rac.MaxOrdersAtRank,
       rac.NumberOfCustomersAtRank,
       FORMAT(rac.AvgOrdersAtRank, @pMAIN_2507200219162290340) AS AvgOrdersAtRankFormatted
FROM OrderRankWithinCountry AS orc
     INNER JOIN
     RankAnalysisWithinCountry AS rac
     ON orc.Country = rac.Country
        AND orc.OrderRank = rac.OrderRank
ORDER BY orc.Country ASC, orc.OrderRank ASC, orc.TotalOrders DESC;


            
        

Parameters (If used)

Name Value
@pMAIN_2507200219162290340 N2

Query Results 1:

  CustomerID CompanyName Country TotalOrders OrderRank MinOrdersAtRank MaxOrdersAtRank NumberOfCustomersAtRank AvgOrdersAtRankFormatted
1 CACTU Cactus Comidas para llevar Argentina 6 1 6 6 1 6.00
2 OCEAN Océano Atlántico Ltda. Argentina 5 2 5 5 2 5.00
3 RANCH Rancho grande Argentina 5 2 5 5 2 5.00
4 ERNSH Ernst Handel Austria 30 1 30 30 1 30.00
5 PICCO Piccolo und mehr Austria 10 2 10 10 1 10.00
6 SUPRD Suprêmes délices Belgium 12 1 12 12 1 12.00
7 MAISD Maison Dewey Belgium 7 2 7 7 1 7.00
8 HANAR Hanari Carnes Brazil 14 1 14 14 1 14.00
9 QUEEN Queen Cozinha Brazil 13 2 13 13 1 13.00
10 RICAR Ricardo Adocicados Brazil 11 3 11 11 1 11.00
11 QUEDE Que Delícia Brazil 9 4 9 9 3 9.00
12 GOURL Gourmet Lanchonetes Brazil 9 4 9 9 3 9.00
13 WELLI Wellington Importadora Brazil 9 4 9 9 3 9.00
14 FAMIA Familia Arquibaldo Brazil 7 7 7 7 1 7.00
15 TRADH Tradição Hipermercados Brazil 6 8 6 6 1 6.00
16 COMMI Comércio Mineiro Brazil 5 9 5 5 1 5.00
17 BOTTM Bottom-Dollar Markets Canada 14 1 14 14 1 14.00
18 MEREP Mère Paillarde Canada 13 2 13 13 1 13.00
19 LAUGB Laughing Bacchus Wine Cellars Canada 3 3 3 3 1 3.00
20 VAFFE Vaffeljernet Denmark 11 1 11 11 1 11.00
21 SIMOB Simons bistro Denmark 7 2 7 7 1 7.00
22 WARTH Wartian Herkku Finland 15 1 15 15 1 15.00
23 WILMK Wilman Kala Finland 7 2 7 7 1 7.00
24 BONAP Bon app' France 17 1 17 17 1 17.00
25 LAMAI La maison d'Asie France 14 2 14 14 1 14.00
26 BLONP Blondesddsl père et fils France 11 3 11 11 1 11.00
27 VICTE Victuailles en stock France 10 4 10 10 1 10.00
28 VINET Vins et alcools Chevalier France 5 5 5 5 2 5.00
29 FOLIG Folies gourmandes France 5 5 5 5 2 5.00
30 DUMON Du monde entier France 4 7 4 4 3 4.00
31 LACOR La corne d'abondance France 4 7 4 4 3 4.00
32 SPECD Spécialités du monde France 4 7 4 4 3 4.00
33 FRANR France restauration France 3 10 3 3 1 3.00
34 PARIS Paris spécialités France 0 11 0 0 1 0.00
35 QUICK QUICK-Stop Germany 28 1 28 28 1 28.00
36 LEHMS Lehmanns Marktstand Germany 15 2 15 15 2 15.00
37 FRANK Frankenversand Germany 15 2 15 15 2 15.00
38 KOENE Königlich Essen Germany 14 4 14 14 1 14.00
39 OTTIK Ottilies Käseladen Germany 10 5 10 10 2 10.00
40 WANDK Die Wandernde Kuh Germany 10 5 10 10 2 10.00
41 BLAUS Blauer See Delikatessen Germany 7 7 7 7 1 7.00
42 ALFKI Alfreds Futterkiste Germany 6 8 6 6 3 6.00
43 DRACD Drachenblut Delikatessen Germany 6 8 6 6 3 6.00
44 TOMSP Toms Spezialitäten Germany 6 8 6 6 3 6.00
45 MORGK Morgenstern Gesundkost Germany 5 11 5 5 1 5.00
46 HUNGO Hungry Owl All-Night Grocers Ireland 19 1 19 19 1 19.00
47 REGGC Reggiani Caseifici Italy 12 1 12 12 1 12.00
48 MAGAA Magazzini Alimentari Riuniti Italy 10 2 10 10 1 10.00
49 FRANS Franchi S.p.A. Italy 6 3 6 6 1 6.00
50 TORTU Tortuga Restaurante Mexico 10 1 10 10 1 10.00
51 ANTON Antonio Moreno Taquería Mexico 7 2 7 7 1 7.00
52 PERIC Pericles Comidas clásicas Mexico 6 3 6 6 1 6.00
53 ANATR Ana Trujillo Emparedados y helados Mexico 4 4 4 4 1 4.00
54 CENTC Centro comercial Moctezuma Mexico 1 5 1 1 1 1.00
55 SANTG Santé Gourmet Norway 6 1 6 6 1 6.00
56 WOLZA Wolski Zajazd Poland 7 1 7 7 1 7.00
57 FURIB Furia Bacalhau e Frutos do Mar Portugal 8 1 8 8 1 8.00
58 PRINI Princesa Isabel Vinhos Portugal 5 2 5 5 1 5.00
59 GODOS Godos Cocina Típica Spain 10 1 10 10 1 10.00
60 GALED Galería del gastrónomo Spain 5 2 5 5 2 5.00
61 ROMEY Romero y tomillo Spain 5 2 5 5 2 5.00
62 BOLID Bólido Comidas preparadas Spain 3 4 3 3 1 3.00
63 FISSA FISSA Fabrica Inter. Salchichas S.A. Spain 0 5 0 0 1 0.00
64 FOLKO Folk och fä HB Sweden 19 1 19 19 1 19.00
65 BERGS Berglunds snabbköp Sweden 18 2 18 18 1 18.00
66 RICSU Richter Supermarkt Switzerland 10 1 10 10 1 10.00
67 CHOPS Chop-suey Chinese Switzerland 8 2 8 8 1 8.00
68 AROUT Around the Horn UK 13 1 13 13 1 13.00
69 BSBEV B's Beverages UK 10 2 10 10 2 10.00
70 ISLAT Island Trading UK 10 2 10 10 2 10.00
71 SEVES Seven Seas Imports UK 9 4 9 9 1 9.00
72 EASTC Eastern Connection UK 8 5 8 8 1 8.00
73 CONSH Consolidated Holdings UK 3 6 3 3 2 3.00
74 NORTS North/South UK 3 6 3 3 2 3.00
75 SAVEA Save-a-lot Markets USA 31 1 31 31 1 31.00
76 RATTC Rattlesnake Canyon Grocery USA 18 2 18 18 1 18.00
77 WHITC White Clover Markets USA 14 3 14 14 1 14.00
78 GREAL Great Lakes Food Market USA 11 4 11 11 1 11.00
79 OLDWO Old World Delicatessen USA 10 5 10 10 1 10.00
80 SPLIR Split Rail Beer & Ale USA 9 6 9 9 1 9.00
81 LONEP Lonesome Pine Restaurant USA 8 7 8 8 1 8.00
82 HUNGC Hungry Coyote Import Store USA 5 8 5 5 1 5.00
83 LETSS Let's Stop N Shop USA 4 9 4 4 2 4.00
84 THEBI The Big Cheese USA 4 9 4 4 2 4.00
85 THECR The Cracker Box USA 3 11 3 3 2 3.00
86 TRAIH Trail's Head Gourmet Provisioners USA 3 11 3 3 2 3.00
87 LAZYK Lazy K Kountry Store USA 2 13 2 2 1 2.00
88 HILAA HILARION-Abastos Venezuela 18 1 18 18 1 18.00
89 LILAS LILA-Supermercado Venezuela 14 2 14 14 1 14.00
90 LINOD LINO-Delicateses Venezuela 12 3 12 12 1 12.00
91 GROSR GROSELLA-Restaurante Venezuela 2 4 2 2 1 2.00