选择查询SQLite中的重复记录

选择查询SQLite中的重复记录,sql,sqlite,Sql,Sqlite,这个问题是这个问题的推广。我不想找到所有特定玩家与其他玩家对抗的游戏,而是希望能够找到所有相同玩家与其他玩家对抗的游戏 以下是示例数据: 1,ChrisEveret,1 1,BillieJeanKing,1 1,RogerFederer,0 1,TomasMuster,0 2,RogerFederer,1 2,SallieMae,1 2,NovakDjokovic,0 2,JimCourier,0 3,ChrisEveret,0 3,BillieJeanKing,0 3,RogerFederer

这个问题是这个问题的推广。我不想找到所有特定玩家与其他玩家对抗的游戏,而是希望能够找到所有相同玩家与其他玩家对抗的游戏

以下是示例数据:

1,ChrisEveret,1
1,BillieJeanKing,1
1,RogerFederer,0
1,TomasMuster,0
2,RogerFederer,1
2,SallieMae,1
2,NovakDjokovic,0
2,JimCourier,0
3,ChrisEveret,0
3,BillieJeanKing,0
3,RogerFederer,1
3,TomasMuster,1
所需输出为

1,ChrisEveret,1
1,BillieJeanKing,1
1,RogerFederer,0
1,TomasMuster,0
3,ChrisEveret,0
3,BillieJeanKing,0
3,RogerFederer,1
3,TomasMuster,1
实际数据只有大约两千行,所以性能不是一个问题。我提出了以下非常复杂且不精确的部分解:

CREATE TABLE sets (gameid int, player text ,winloss int);
  .import data.csv sets
  select *  from sets where gameid in
   (select gameid from (select gameid,mo from
    (select gameid,mo,count(*) from
     (select gameid,group_concat(player) as mo from
      (select gameid,player from sets order by gameid,player)
     group by gameid)
   group by gameid)
  where mo in 
   (select mo from (select gameid,mo,count(*) from
    (select gameid,group_concat(player) as mo from
     (select gameid,player from sets order by gameid,player)
     group by gameid)
     group by mo
     having count(*)>1))));

这将返回相同的四个人一起比赛的所有比赛,但不一定是球队相同的比赛。我不知道是否有解决此问题的方法不涉及使用group_concat()。然而,这是我在这方面取得有限进展的唯一途径。我也不确定用于为聚合排序group_concat结果的方法是否始终有效。

SQLite不能保证使用
group_concat()
--进行排序,并且无法控制它。所以你必须使用更麻烦的方法

您可以使用以下方法获得同一玩家的成对游戏:

with s as (
       select s.*, count(*) over (partition by gameid) as num_players
       from sets s
      )
select s1.gameid, s2.gameid
from s s1 join
     s s2
     on s1.player = s2.player and s1.num_players = s2.num_players
group by s1.gameid = s2.gameid
having count(*) = max(s1.num_players);
如果你想让玩家参与每一场游戏,你可以使用这个逻辑(或者只需使用
group\u concat()

编辑:

SQLite版本3.28中引入了窗口函数。在早期版本中,请尝试以下操作:

with s as (
       select s.*, ss.num_players
       from sets s join
            (select gameid, count(*) as num_players
             from sets s
             group by gameid
            ) ss
            on ss.gameid = s.gameid
      )
select s1.gameid, s2.gameid
from s s1 join
     s s2
     on s1.player = s2.player and s1.num_players = s2.num_players
group by s1.gameid = s2.gameid
having count(*) = max(s1.num_players);

是一个DBFIDLE,显示所有具有相同玩家的游戏对(请注意,这包括每个团队本身)。

@user2619203。您使用的是不支持窗口函数的较旧版本的SQLite吗?对于3.30.1,语法错误接近“s”。我已经试过几次了。@user2619203。有一个输入错误,表别名
s
位于错误的括号旁边。我现在得到“没有像s.num\u players这样的列”。我将“s1.num\u players=s.num\u players”结尾的行更改为“s1.num\u players=s2.num\u players”,它运行但没有返回结果。我一点也不遵循这个逻辑,所以我不知道这是否是我的本意。