【问题标题】:PostgreSQL - Only different values in fieldsPostgreSQL - 字段中只有不同的值
【发布时间】:2018-06-25 08:57:47
【问题描述】:

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

【问题讨论】:

  • 您使用的是 MySQL 还是 PostgreSQL?您应该具体说明您正在使用的 DBMS...
  • 对不起,我用的是postgresql,我选错了mysql
  • 那么考试由三个问题组成?而且您不在乎选择哪些组合,只要没有考试有任何共同问题?那么最简单的就是 1,2,3 - 4,5,6 - 7,8,9 - ...这对你来说是一个解决方案吗?

标签: sql database postgresql combinations


【解决方案1】:

让我们考虑问题表有

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       

【讨论】:

  • 为什么是LIMIT 8*6 而不是LIMIT 8*3
  • 其实是错别字
【解决方案2】:

一个简单的方法是这样的(交叉连接会很慢 - 例如 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

【讨论】:

    【解决方案3】:

    给你的问题编号: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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      相关资源
      最近更新 更多