Access SQL實現連續及不連續Rank排名


一、關於起因

在Excel中我們經常使用Rank函數對數據進行排名操作。而在Access中我們要進行排名是找不到這個Rank函數的,此時我們需要自己書寫VBA代碼或者建立SQL查詢來完成排序操作。

今天我就來講講如何在Access中進行Rank排名操作,首先我給大家分析一下排名的種類跟實現方法。

二、排名的種類跟算法

1、非連續排名

邏輯算法:對於一組數列里的某個數字而言,其非連續排名是指:在該組數列里比該數字大的所有數字的個數+1

2、連續排名

邏輯算法:對於一組數列里的某個數字而言,其連續排名是指:在該組數列里比該數字大的所有非重復數字的個數+1

三、不同的實現方式

首先我們做好准備工作,我們要建立必要表及其內部數據,如下圖所示分別為表的結構及部分初始數據:

1、VBA實現方式

我寫了一個Sub過程RankField,該過程的參數說明如下:

TableRanked:需排名的表名

FieldRanked:數據所在字段的字段名

FieldResult:排名后結果存儲的字段名

NormalRank:是否是常規排名(True是常規排名,非連續排名,Excel中的Rank函數即為非連續排名;False為連續排名)

 1 Sub RankField(TableRanked As String, FieldRanked As String, FieldResult As String, NormalRank As Boolean)
 2     Dim rs As New ADODB.Recordset
 3     Dim rs1 As New ADODB.Recordset
 4     rs.Open "Select " & FieldRanked & "," & FieldResult & " From " & TableRanked, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
 5     Do Until rs.EOF
 6         If NormalRank Then
 7             rs1.Open "Select Count(*)+1 as CountNum From " & TableRanked & " Where " & FieldRanked & ">" & rs.Fields(FieldRanked).Value, _
 8                 CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
 9         Else
10             rs1.Open "Select Count(*) as CountNum From (Select Distinct " & FieldRanked & " From " & TableRanked & " Where " & FieldRanked & ">=" & rs.Fields(FieldRanked).Value & ")", _
11                 CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
12         End If
13         rs.Fields(FieldResult).Value = rs1!CountNum.Value
14         rs1.Close
15         rs.MoveNext
16     Loop
17     rs.Close
18 End Sub

按下Ctrl+G,切換到立即窗口,分別輸入如下類似的代碼:

1 RankField "Score","Score","Rank1_VBA",true
2 RankField "Score","Score","Rank2_VBA",False

我們會得到如下類似的結果,Rank1_VBA列為非連續排名結果,Rank2_VBA為連續排名結果:

2、SQL查詢實現方式

相比於VBA代碼方式,在成績值發生修改時,SQL查詢可以自動更新排名數據,而不需要像VBA過程要每次都手動重新運算.

1 SELECT 
2     Score.id, 
3     Score.Score, 
4     Score.Rank1_VBA, 
5     Score.Rank2_VBA, 
6     (Select Count(*)+1 From score AS Score_1 Where Score_1.Score>Score.Score) AS Rank1, 
7     (Select Count(*)+1 From (Select Distinct Score_1.score From score AS Score_1) As tbl Where tbl.Score>Score.Score) AS Rank2
8 FROM Score;

創建這個查詢后,會活的如下所示的運行結果:Rank1與Rank1_VBA對應,Rank2與Rank2_VBA對應.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM