簡體   English   中英

如何在兩個自連接列中選擇不同的記錄?

[英]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 ,然后將nn + 1配對

小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM