PostgreSQL-字段中只有不同的值

时间:2018-06-25 08:57:48

标签: sql database postgresql combinations

我有一个名为问题的表,其中包含一列充满考试问题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个由彼此不同的问题组成的考试。

3 个答案:

答案 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;