是否可以在视图中仅返回每个ID的一个实例?

时间:2015-09-21 04:33:54

标签: postgresql view

我正在尝试弄清楚当我尝试在源表上进行内部联接时,我将如何确保只获得每个用户的一个实例及其ID。 源数据是一系列用户名和ID

userid  username
 1      alice
 2      bob
 3      charley
 4      dave
 5      robin
 6      jon
 7      lou
 8      scott

我必须在python中编写算法,以确保我只获得一组用户数据与另一组匹配(因此我们可以确保每轮用户的数据使用一次) 我们存储配对,测试后成功完成了多少轮,但我想尝试简化流程 我可以获得所有结果,但我想找到一种更好的方法从结果中删除每个匹配的对,这样它们就无法再次匹配。

select u.user_id, u.user, ur.user_id, ur.user
    from userResults u inner join userResults ur
on u.user_id < ur.user_id
and (u.user_id, ur.user_id) not in
(select uid, uid2 from rounds)
where u.match <= ur.match and ((u.user_id) not in %s
and ur.user_id not in %s) limit 1;

我尝试使用一个独特的约束来制作物化视图,但它似乎并没有影响它 - 我每次都可以配对一次,而不是每个用户只配对一次

我试图找出如何以正确的顺序获得4个结果。 每次我查看底层代码时,我都无法帮助,但认为在SQL中本地编写它是一种更好的方法,而不必在python中迭代结果。

修改

假设每个用户已匹配0次或更多次,您可能会有一个位置,其中user_id 1-4的轮次设置为1,匹配设置为1,其余4个轮次设置为1和没有比赛。

我有一个视图,如果它们尚未播放,将返回默认值0和0的轮次和匹配,并且您不能假设所有输入的轮次都符合匹配。

如果前4个已全部匹配,并且已生成回合,则用户1和用户2已经在一轮中遇到并匹配,因此他们不会再次匹配,因此用户1将匹配用户3(或4)用户2将匹配用户4(或3) 我遇到的问题是,当我移除限制并手动迭代时 - 我总得到的前三个匹配是:2,4然后是1,3,然后是2,3(而不是5,7或6, 8)

添加样本数据和当前轮次 桌轮

uid     uid2
1       2
3       4

用户结果视图

user_id user    rounds  score
1   alice   1   0
2   bob     1   1
3   charley 1   1
4   dave    1   0
5   robin   0   0
6   jon     0   0
7   lou     0   0
8   scott   0   0

我目前的结果如下:

2,4
2,3
1,3
1,4
4,6

...

这些都是有效的结果,但我想将它们限制在每列中每个ID的单个实例,所以只是每个有效配对的第一个匹配。

我已经创建了一个新视图来尝试和简化事物但是,并使用虚拟数据填充它并尝试生成匹配 所有这些匹配都是有效的,我试图添加某种形式的过滤器或限制,以使其恢复到合理的数字。

777;"Bongo Steveson";779;"Drongo Mongoson"
777;"Bongo Steveson";782;"Cheesey McHamburger"
777;"Bongo Steveson";780;"Buns Mattburger"
779;"Drongo Mongoson";782;"Cheesey McHamburger"
779;"Drongo Mongoson";781;"Hamburgler Bunburger"
775;"Bob Jobsworth";777;"Bongo Steveson"
778;"Mongo Bongoson";779;"Drongo Mongoson"
775;"Bob Jobsworth";778;"Mongo Bongoson"
778;"Mongo Bongoson";781;"Hamburgler Bunburger"
775;"Bob Jobsworth";782;"Cheesey McHamburger"
775;"Bob Jobsworth";781;"Hamburgler Bunburger"
775;"Bob Jobsworth";780;"Buns Mattburger"
776;"Steve Bobson";777;"Bongo Steveson"
776;"Steve Bobson";779;"Drongo Mongoson"
776;"Steve Bobson";782;"Cheesey McHamburger"
776;"Steve Bobson";778;"Mongo Bongoson"
776;"Steve Bobson";781;"Hamburgler Bunburger"
780;"Buns Mattburger";782;"Cheesey McHamburger"
780;"Buns Mattburger";781;"Hamburgler Bunburger"

我仍然无法通过明智的方式限制这些价值观,这让我疯狂。 我已经在代码中实现了一个解决方案,但我真的很想知道我是否可以在本地Postgres中使用它。
此时我正在使用新的测试数据库模式进行修改,这是我的观点 - 索引的唯一添加会生成错误,我无法在物化视图中添加检查约束(grrrr) )

1 个答案:

答案 0 :(得分:0)

您可以尝试加入子查询以确保来自用户表的不同记录。

select * from any_table t1 
inner join(
  select distinct userid,username from  source_table  
) t2 on t1.userid=t2.userid;