Sql-Server

在排名列表中查找最近的追隨者

  • May 18, 2020

在我的數據庫中,我有一個名為Rank_List_T

等級名稱時間
約翰一書 110
2大衛120
3鮑勃121
4 漢斯 124
5 克勞斯 126
6古斯塔夫140

我對追隨者最近的人感興趣。在上表中,David 之後是 Bob,相差 1。Hans 之後是 Claus,相差 2。

我需要一個返回這個的 SQL 查詢:

名稱時差
大衛 1
漢斯 2
鮑勃 3
約翰福音 10
第 14 條

是的,這可以通過將表連接RankList_T到它自己來完成:

選擇
r1.rank,r1.name,r1.time,
r2.rank,r2.name,r2.time,
r2.time-r1.time 作為 time_diff
來自 GUEST。[RANK_LIST_T] r1
left join GUEST.[RANK_LIST_T] r2 on r1.rank+1=r2.rank
其中 r2.rank 不為空
按 r2.time-r1.time 排序
;

但這具有非常差的性能,算法複雜度為 O(n^2)。我正在尋找一種更有效的方法來在 SQL 數據庫上執行此操作。

請檢查DDL 和 DML 以重現問題

SELECT *, LEAD(time) OVER (ORDER BY time) - time AS delta
FROM RANK_LIST_T
ORDER BY 4;

小提琴

引用自:https://dba.stackexchange.com/questions/267376