【问题标题】:In Postgres: Select columns from a set of arrays of columns and check a condition on all of them在 Postgres 中:从一组列数组中选择列并检查所有列的条件
【发布时间】:2018-07-31 12:57:01
【问题描述】:

我有一张这样的桌子:

我想对不同的列集(其中至少有一个来自 X 的元素和一个来自 Y 的元素的所有子集)执行计数。我怎样才能在 Postgres 中做到这一点?

例如,我可能有 {x1,x2,y3}、{x4,y1,y2,y3} 等。我想计算每组中具有 1 的“id”的数量。所以对于第一组:

SELECT COUNT(id) FROM table WHERE x1=1 AND x2=1 AND x3=1;

第二组也是这样:

SELECT COUNT(id) FROM table WHERE x4=1 AND y1=1 AND y2=1 AND y3=1;

是否可以编写一个遍历所有这些集合并相应地查询表的循环?数组会超过10000个集合,所以不能手动完成。

【问题讨论】:

  • “遍历所有这些集合”是什么意思?你说你需要包含 x1-y4 的集合的所有排列吗?
  • 正确!对于 X 和 Y 的所有可能组合(当然顺序并不重要)。实际表有超过 8 列。所以排列的数量甚至更高。如果有解决方案,我也可以在 Python 中执行此操作!

标签: sql arrays postgresql loops


【解决方案1】:

您应该能够使用ARRAY[col1, col2,...] 将表格列转换为数组,然后使用array_positions 函数,将第二个参数设置为您要检查的值。因此,根据上面的示例,此查询:

SELECT id, array_positions(array[x1,x2,x3,x4,y1,y2,y3,y4], 1)
FROM tbl
ORDER BY id;

会产生这个结果:

+----+-------------------+
| id |  array_positions  |
+----+-------------------+
|  a |  {1,4,5}          |
|  b |  {1,2,4,7}        |
|  c |  {1,2,3,4,6,7,8}  |
+----+-------------------+

这是SQL Fiddle

【讨论】:

  • 我使用的 postgres 版本不支持“array_positions”函数(是 9.2)。但是您的回答有助于在 python 中找到解决方案! :-) 谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 2012-12-09
  • 1970-01-01
相关资源
最近更新 更多