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_2507192105573248440) 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_2507192105573248440 |
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
|