我有一个像这样的数据集:
| 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} |
我不确定从哪开始,我尝试过的一切都失败了。
我发现有一种叫做数组包含操作符@>
的东西,但实际上并不知道如何应用它。
执行此操作是否有合理的查询?任何帮助都会很棒。谢谢!
答案 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, ',') || ',%'
);