[英]How to select distinct records across two self-joined columns?
我有一個播放器表,我正在嘗試構建一個SQL查詢來配置它們以分配特定輪次的匹配。 每個玩家都有一個分數,我想配對有相似分數的玩家。 我不希望任何玩家出現在一對以上。
首先,我創建了以下視圖:
CREATE VIEW all_possible_pairs AS
SELECT p1.id AS player1, p2.id AS player2
FROM players as p1, players as p2
WHERE p1.id < p2.id
ORDER BY ABS(p1.score - p2.score)
all_possible_pairs獲得所有可能的玩家對,並避免匹配玩家自己並包括相同的兩次(例如a,bb,a)。 數據以我想要的方式排序,使得首先出現的對優先於稍后出現的對(因為它們具有更接近的分數)。
我想從all_possible_pairs中選擇玩家第一次出現的行。 在結果表中,每個玩家應該在兩列中僅出現一次(例如,如果玩家首次出現在player2中,則他們不應該出現在任何后續行中的player1或player2中)。
所以,例如,假設我們有玩家a,b,c,d和all_possible_players看起來像這樣:
player1, player2
a b
a c
a d
b c
b d
c d
我想從這個視圖中選擇,以便我得到以下內容:
player1, player2
a b
c d
我一直在撞牆一段時間嘗試各種SELECT DISTINCT條款,但我似乎無法做到正確。 例如,上例中的player1上的SELECT DISTINCT將包含b,c,這不是我想要的,因為它意味着b和c在表中兩次。
不是列出所有可能的配對,而是創建一個視圖,為每個玩家提供排名,而不是分數:
CREATE VIEW ranked_players AS
SELECT id AS Playerid, row_number() OVER (order by score) as PlayerRank
FROM players
現在當你配對它們時,將奇數排名的那些與它們相鄰的偶數排名的鄰居配對:
SELECT ranked1.PlayerId player1,
ranked2.PlayerId player2
FROM ranked_players AS
ranked1
INNER JOIN ranked_players
AS ranked2 ON ranked1.
PlayerRank+ 1 = ranked2.
PlayerRank
WHERE ranked1.playerrank % 2
= 1
看看是否能滿足您的需求。
可能不完全是你想要的,但是:
with cte as
(select *, row_number() over (order by score desc) as rn
from players)
select *
from cte as t1 join cte as t2
on t2.rn = t1.rn+1
where mod(t1.rn, 2) = 1
and mod(t2.rn, 2) = 0
這基於得分分配row_number n ,然后將n與n + 1配對
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.