选择查询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”,它运行但没有返回结果。我一点也不遵循这个逻辑,所以我不知道这是否是我的本意。