当前位置: 首页 > 面试题库 >

Postgres按查询分组

濮阳原
2023-03-14
问题内容

我正在尝试在postgres中的查询中使用group by。我无法按照我想要的方式对其进行工作,以便根据需要对结果进行分组。

这是对我刚刚回答的递归查询的另一个堆栈问题的扩展。但是现在我需要能够将结果分组到最终查询的root_id列上。这是之前的查询:

select cl.parent_comment_id, 
     cl.article_comment_id,
     cl.comment, 
     cl.article_id,
     cl.comment_depth
from comment_list cl
order by cl.root_id, cl.article_comment_id, cl.comment_depth;

这是我想做的,以便将具有相同parent_comment_id的所有记录保存在一起。

select cl.parent_comment_id, 
     cl.article_comment_id,
     cl.comment, 
     cl.article_id,
     cl.comment_depth
from comment_list cl
group by cl.parent_comment_id
order by cl.parent_comment_id, cl.article_comment_id, cl.comment_depth;

可能有许多记录返回了相同的parent_comment_id,但对于任何给定的article_comment_id却有不同的记录。即,每个注释都是唯一的(id,注释,标题等),但是每个父注释可以有多个子代。递归查询已经检索到了它,现在我只是试图将它们正确地分组。

编辑:

看一看http://www.sqlfiddle.com/#!12/77771/2。我想要的是article_comment_id
= 6紧跟在article_comment_id = 3下面,因为id = 3是父级。然后article_comment_id = 4。

但是,我认为这需要按程序进行。

因此,我认为这是一个“没关系”的问题,除非有人知道如何做(这就是为什么我放弃它)。但是我想我将尝试在程序上解决这一部分。


问题答案:

对于递归查询,您可以使用带有0填充字符串的此技巧创建分层路径:SQL
Fiddle

with recursive comment_list(article_comment_id, parent_comment_id, comment, article_id, comment_depth, comment_path) AS (
    select c.article_comment_id, 
           c.parent_comment_id, 
           c.comment, 
           c.article_id, 
           c.comment_depth,
           substr(CAST(1000000000+c.article_comment_id as varchar(1000)),2)
    from test_comment c
    where article_id = 100
      and parent_comment_id = 0

  union all

    select c.article_comment_id, 
           c.parent_comment_id, 
           c.comment, 
           c.article_id, 
           c.comment_depth,
           cl.comment_path || substr(CAST(1000000000+c.article_comment_id as varchar(1000)),2)
    from test_comment c
       join comment_list cl on c.parent_comment_id = cl.article_comment_id
)
select cl.article_comment_id,
     cl.comment_path, 
     cl.parent_comment_id,
     cl.comment, 
     cl.article_id,
     cl.comment_depth
from comment_list cl
order by cl.comment_path, cl.article_comment_id, cl.comment_depth;

删除GROUP BY。您想对它们进行“分组”以进行显示,这实际上是“ ORDER BY”

select cl.parent_comment_id, 
     cl.article_comment_id,
     cl.comment, 
     cl.article_id,
     cl.comment_depth
from comment_list cl
order by cl.parent_comment_id, cl.article_comment_id, cl.comment_depth;

您可能还是不需要cl.root_id按顺序排序,所以可能是

order by cl.root_id, cl.parent_comment_id, cl.article_comment_id, cl.comment_depth;


 类似资料:
  • 问题内容: 我需要查询方面的帮助,比方说这是表中的数据。 我想获得至少比最后一行晚5分钟的每一行(时间戳)。在这种情况下,查询应返回: 问题答案: 递归CTE 由于每一行都取决于之前的一行,因此很难使用基于集合的方法来解决。求助于递归CTE(这是标准SQL): 请注意我的初稿中的更新: 递归CTE中不允许使用聚合函数。我用/代替,当/上的 索引 支持时应该很快。 查询每条腿周围的括号对于允许是必须

  • 我目前加入了5个表来选择20个对象显示给用户,不幸的是,如果我使用和,它会变得非常慢。 查询的解释显示如下: 所以看起来它没有为表使用键,分析说明它使用2.7s复制到tmp表。 没有使用或,我尝试使用,但不幸的是,这没有改善。 我想我错过了一些基本的概念在这里和任何帮助将是感激的。 由于很可能是我弄错了表,下面是对表的描述: Objekte laender,regionen,subregionen

  • 问题内容: 如何在按部分分组的查询中使用子查询? 我使用SQL Server 2008 R2和Delphi 2010 我收到此错误: 像这个查询: 按t1.sen分组 问题答案: 这是真实的方式

  • 我有一个表abc,其中可以针对一个UserId有一个或多个行。abc表有列值。我希望结果是每个UserId值的总和。 示例:userid1- 我现在拥有的: 结果:它单独返回每行的总和。所以我有这样的: 用户标识1- 我应该更改或添加什么来完成查询? PS.我知道这是一个非常常见/简单的解决方案,但似乎找不到任何解决方案。:(

  • 问题内容: 我在MySQL中有一张表,该表显示了我每天记录的小时数。我正在尝试建立一个视图,该视图将允许我按块/天范围快速将数据分组。最简单的情况是每月一次,这并不难。我可以将日期选择为“%y-%m”,然后按该列分组。 前任: 如果我按月分组,那很好。但是我的问题是,我需要从每月的13号到下个月的12号进行分组(例如:7月13日至8月12日,8月13日至9月12日,等等)。 有没有一种简单的方法可

  • 您将如何在存储在列中的数组中搜索元素?(更新:另请参阅列的9.4更新答案。) 如果我有这样一个JSON文档,存储在名为blob的列中: 我想做的是: 并取出所有匹配的行。但这不起作用,因为