我有一个名为问题的表,其中包含一列充满考试问题ID的表格。假设:
Q1
Q2
Q2
...
Qn
现在,我想选择三个问题的所有组合,例如:
1, 2, 3
...
2, 5, 6
4, 7, 1
...
9, 6, 8
并选择仅由具有全局唯一值的行组成的子集。在以前的情况下:
1, 2, 3
9, 6, 8
因为其他两个记录包含2和1,它们都包含在(1、2、3)记录中。
如何在SQL中实现?假设要创建8个由彼此不同的问题组成的考试。
答案 0 :(得分:0)
让问题表具有
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
答案 1 :(得分:0)
一种简单的方法是这样的(CROSS连接将很慢-例如,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用于MS SQL Server,但可以适用于PostgreSQL
答案 2 :(得分:0)
给出您的问题编号:1、2、3、4、5 ... n。然后除以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;