我有一个名为“问答题”的表,其中包含一个包含考试问题ID的列。让我们说:
Q1
Q2
Q2
...
Qn现在,我想选择三个问题的所有组合,比如:
1, 2, 3
...
2, 5, 6
4, 7, 1
...
9, 6, 8并将其中的一个子集分离为仅具有全局唯一值的行。在前一种情况下:
1, 2, 3
9, 6, 8因为其他两个记录都包含在(1,2,3)记录中。
如何在SQL中实现这一点?这样做的目的是为了创造,比如说,由彼此不同的问题组成的8个考试。
发布于 2018-06-25 09:56:04
让我们考虑一下试题表
Table : questions
Qid
1
2
3
.
n现在,如果您只想选择8个(三个问题)不同的随机子集,那么
SELECT FO,STRING_AGG(QID , ',')
FROM (SELECT Qid , (Qid / 3) :: INT AS FO FROM QUETIONS
ORDER BY RANDOM ()
LIMIT 8*3 )
GROUP BY FO 发布于 2018-06-25 10:52:34
一种简单的方法是这样的(交叉连接将是缓慢的,例如,100个问题可能需要半分钟)
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
发布于 2018-06-25 14:47:22
给出你的问题号: 1,2,3,4,5.然后除以其余的3: 0,0,0,1,1,.n/3得到三组。这取决于你如何编号问题,例如按ID (最少的ID是记录#1,下一个ID是记录#2,.)或者随机的。下面是一个随机示例:
select *, (row_number() over (order by random()) - 1 ) / 3 as grp
from questions
order by grp;将结果保持原样,或将其转到每一行有三列的grp上。
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;https://stackoverflow.com/questions/51019662
复制相似问题