首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL -字段中仅存在不同的值

PostgreSQL -字段中仅存在不同的值
EN

Stack Overflow用户
提问于 2018-06-25 08:57:47
回答 3查看 53关注 0票数 0

我有一个名为“问答题”的表,其中包含一个包含考试问题ID的列。让我们说:

代码语言:javascript
复制
Q1
Q2
Q2
...
Qn

现在,我想选择三个问题的所有组合,比如:

代码语言:javascript
复制
1, 2, 3
...
2, 5, 6
4, 7, 1
...
9, 6, 8

并将其中的一个子集分离为仅具有全局唯一值的行。在前一种情况下:

代码语言:javascript
复制
1, 2, 3
9, 6, 8

因为其他两个记录都包含在(1,2,3)记录中。

如何在SQL中实现这一点?这样做的目的是为了创造,比如说,由彼此不同的问题组成的8个考试。

EN

回答 3

Stack Overflow用户

发布于 2018-06-25 09:56:04

让我们考虑一下试题表

代码语言:javascript
复制
Table : questions

Qid
1
2
3
.
n

现在,如果您只想选择8个(三个问题)不同的随机子集,那么

代码语言:javascript
复制
SELECT FO,STRING_AGG(QID , ',') 
FROM (SELECT Qid , (Qid / 3) :: INT AS FO  FROM QUETIONS   
      ORDER BY RANDOM ()
      LIMIT 8*3 )
GROUP BY FO       
票数 0
EN

Stack Overflow用户

发布于 2018-06-25 10:52:34

一种简单的方法是这样的(交叉连接将是缓慢的,例如,100个问题可能需要半分钟)

代码语言:javascript
复制
  SELECT Q1.ID AS Q1, Q2.ID AS Q2, Q3.ID AS Q3
  FROM Questions AS Q1, Questions AS Q2, Questions AS Q3
  WHERE Q1.ID <> Q2.ID AND Q1.ID <> Q3.ID AND Q2.ID <> Q3.ID
  ORDER BY RANDOM() LIMIT 8

然而,有更聪明的方法来做到这一点-- this answer是用于more的,但可以适应PostgreSQL

票数 0
EN

Stack Overflow用户

发布于 2018-06-25 14:47:22

给出你的问题号: 1,2,3,4,5.然后除以其余的3: 0,0,0,1,1,.n/3得到三组。这取决于你如何编号问题,例如按ID (最少的ID是记录#1,下一个ID是记录#2,.)或者随机的。下面是一个随机示例:

代码语言:javascript
复制
select *, (row_number() over (order by random()) - 1 ) / 3 as grp
from questions
order by grp;

将结果保持原样,或将其转到每一行有三列的grp上。

代码语言:javascript
复制
select
  max(case when rn % 3 = 0 then q end) as q1,
  max(case when rn % 3 = 1 then q end) as q2,
  max(case when rn % 3 = 2 then q end) as q3
from 
(
  select *, row_number() over (order by random()) - 1 as rn
  from questions
) numbered
group by rn / 3
order by rn / 3;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51019662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档