【问题标题】:Select postgresql for combinations选择 postgresql 进行组合
【发布时间】:2015-12-13 13:18:33
【问题描述】:

我有以下 2 个表: SQL Tables

我有一个 id 列表 (1,2,3,4,5,6,7,8, ..., 10000)。 这些 id 的唯一组合被插入到另一个表中。

那么,如果我将 id 列表传递给搜索,我该如何找到这些独特的组合。

例如,我搜索 ARRAY([2,3,4])。该组合只存在于unique_combnation 1,所以结果如下:

1 3
1 2
1 4

没有任何包含 ID ARRAY([2,3,4]) 的 unique_comb。

如果我搜索[1,4],结果如下:

1 3
1 2
1 4
2 2
2 4
2 5

我该怎么做?我知道如何以不好的方式做到这一点:

  1. 创建临时表 t1
  2. 遍历给定的 id:SELECT * FROM .. where id = ANY(ARRAY[1,4]) 并获取所有行,将所有行插入 t1。
  3. 然后按 unique_comb 对所有内容进行分组。
  4. 然后计算组数。如果唯一组合的数量不超过1,则返回唯一组合的id,否则(唯一组合> 1)不返回任何内容

这是一种用 1-2 条 sql 行实现的方法吗?我正在使用 postgresql 9.3

select unique_comb t2 where id = ANY(ARRAY[1, 4]) group by unique_comb ...

下面的答案是正确的。我只修改了一点查询,它就开始工作了。

它会从表唯一的东西中选择几个id。

select unique_comb, array_agg(id) t2 where id = ANY(ARRAY[1, 4]) group by unique_comb 的结果如下:

【问题讨论】:

  • 你的第二个例子似乎没有意义。

标签: sql postgresql combinations postgresql-9.3


【解决方案1】:

您描述的过程似乎类似于group by

select unique_comb
from t2
where id = ANY(ARRAY[1, 4])
group by unique_comb
having count(*) = array_length(ARRAY[1, 4], 1);

【讨论】:

    【解决方案2】:

    对于 big 表和 long 数组(不适用于只有 2 或 3 个元素的示例) ,使用递归 CTE 的更复杂的查询会更快。

    无论如何,您都需要(id, unique_comb) 上的索引 - 按此顺序!主键很好用。

    WITH RECURSIVE cte AS (
       SELECT unique_comb, id, 2 AS i  -- start with index for 2nd array elem
       FROM   tbl
       WHERE  id = 5  -- *first* element array
    
       UNION ALL
       SELECT t.unique_comb, t.id, c.i + 1
       FROM   cte c
       JOIN   tbl t USING (unique_comb)
       WHERE  t.id = ('{5, ... long array ... , 4}'::int[])[c.i]  -- your array here
       )
    SELECT unique_comb
    FROM   cte
    WHERE  id = 4;  -- *last* element of array
    

    这种方法的优点是在游戏早期排除了大部分(或所有)行。如果你有关于值频率的信息,你会把最稀有的元素放在第一位。

    【讨论】:

      猜你喜欢
      • 2018-07-17
      • 2015-06-04
      • 1970-01-01
      • 2016-11-19
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      • 2018-09-06
      相关资源
      最近更新 更多