【问题标题】:Removing (grouping by) arrays which are subsets of the biggest array删除(分组)作为最大数组子集的数组
【发布时间】:2018-09-23 13:56:29
【问题描述】:

我有一个如下所示的数据集:

| 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}   |

路径列表示通过图的一种层次路径,从某个节点到另一个节点。我试图将每条路径折叠成从根节点到叶节点的最长路径 - 应该注意元素的顺序很重要({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}   |

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

我发现有一个叫做数组包含运算符@>的东西,但不知道如何应用它。

这样做有合理的查询吗?任何帮助都会很棒。谢谢!

【问题讨论】:

    标签: sql arrays postgresql aggregate subset


    【解决方案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, ',') || ',%' 
                     );
    

    【讨论】:

    • 这似乎不起作用...我运行了这个测试查询,但它无法带回任何行with paths(path) AS (VALUES(array[1]), (array[1, 2]),(array[1, 2, 3])) select p.* from paths p where not exists (select 1 from paths p2 where p2.path @&gt; p.path);
    • @jonny 。 . .哎呀。数组包含自身。所以我们也需要一个不等式条件。
    • 感谢您的回答!它肯定更接近,但看起来 &lt;@ 运算符在我的情况下不起作用,因为它按值而不是子集进行比较。所以它匹配(并删除)例如{16, 85, 1} 因为 {16, 85, 80, 1} 包含所有 3 个以前的值……但就我而言,顺序很重要。
    • 啊,看起来 array_to_string 需要一个分隔符,(你可能想编辑你的答案)-接受!
    • @jonny 。 . .谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2013-06-04
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多