删除(分组)最大数组的子集

时间:2018-09-23 13:56:30

标签: sql arrays postgresql aggregate subset

我有一个像这样的数据集:

| path              |
|-----------------  |
| {16,13}           |
| {16,85}           |
| {16,85,1}         |
| {16,85,2}         |
| {16,85,15}        |
| {16,85,80}        |
| {16,85,80,1}      |
| {16,85,80,63}     |
| {16,85,80,63,1}   |

path列表示从某个节点到另一个节点的遍历图的一种分层路径。我正在尝试将每个路径折叠成从根节点到叶节点的最长路径-应该注意的是,元素的顺序很重要({1, 2, 3}!= {3, 2, 1})。

例如:

  • 路径{16, 13}是按顺序包含16和13 的最长路径,因此它保持不变。
  • 路径{16, 85}不是最长的路径,因为存在一条较长的路径,其中依次包含元素 ,即{16, 85, 2}。因此,应从结果集中丢弃带有{16, 85}的行,并保留{16, 85, 2},因为它恰好是最长的行。
  • 等等每隔一行

因此,结果集如下:

| path              |
|-----------------  |
| {16,13}           |
| {16,85,1}         |
| {16,85,2}         |
| {16,85,15}        |
| {16,85,80,1}      |
| {16,85,80,63,1}   |

我不确定从哪开始,我尝试过的一切都失败了。

我发现有一种叫做数组包含操作符@>的东西,但实际上并不知道如何应用它。

执行此操作是否有合理的查询?任何帮助都会很棒。谢谢!

1 个答案:

答案 0 :(得分:1)

我认为您希望使用“不包含”运算符。因此,您可以这样做:

select p.*
from paths p
where not exists (select 1
                  from paths p2
                  where p2.path @> p.path and p2.path <> p.path
                 );

我不保证这种方法有效,但是在较小的桌子上应该能很好地工作。

编辑:

要处理排序,一种方法是将其转换为字符串:

select p.*
from paths p
where not exists (select 1
                  from paths p2
                  where array_to_string(p2.path, ',') like array_to_string(p.path, ',') || ',%' 
                 );