postgresql-子查询,用于在特定实例之后查找随机实例。不作为主查询的一部分工作

postgresql-子查询,用于在特定实例之后查找随机实例。不作为主查询的一部分工作,sql,postgresql,Sql,Postgresql,为了澄清适度性等问题,以下是我之前帖子的后续内容: 这个问题已经解决了,但是我现在需要把这个答案作为一个更大的问题的一部分,并且需要问另一个问题,因为很难让它工作 前面的查询使我能够在单个数据列表中提取绿线,如下图所示: 我现在需要循环这个子查询,同时处理一些指定的列表,直到我的主查询完成一些特定的计数。遗憾的是,当试图实现这一点时,主查询只执行此子查询一次,而不是遍历所有列表。我试着用很多不同的方式来编写它,包括CTE和派生表样式,但是无论我如何构造它,结果都是一样的。这使我相信我可能需要

为了澄清适度性等问题,以下是我之前帖子的后续内容:

这个问题已经解决了,但是我现在需要把这个答案作为一个更大的问题的一部分,并且需要问另一个问题,因为很难让它工作

前面的查询使我能够在单个数据列表中提取绿线,如下图所示:

我现在需要循环这个子查询,同时处理一些指定的列表,直到我的主查询完成一些特定的计数。遗憾的是,当试图实现这一点时,主查询只执行此子查询一次,而不是遍历所有列表。我试着用很多不同的方式来编写它,包括CTE和派生表样式,但是无论我如何构造它,结果都是一样的。这使我相信我可能需要对子查询进行稍微不同的编码,以便主查询知道如何不断重复子查询条件

为了清楚起见,这里有一个我拥有的最新代码的示例,这样你就可以准确地看到我的错误所在(编辑为包含代码并删除代码链接,我的道歉相对较新,发布在这里):


再次感谢您的帮助,非常感谢

好的,经过多次尝试和错误,我成功地编写了以下代码,以提供我想要的结果集:

WITH alpha AS 
(SELECT table1a.urid, (SELECT MIN(table1b.classifier) FROM historic_table table1b WHERE table1b.urid=table1a.urid) AS min_agent
   FROM historic_table table1a 
  WHERE table1a.queue=42
    AND table1a.tstamp>=(current_date-7))
,stats AS
 (SELECT a.min_agent AS name
        ,COUNT(DISTINCT CASE WHEN table2.queue=1 AND table2.status=0 THEN table2.id ELSE NULL END)AS count_1
        ,COUNT(DISTINCT CASE WHEN table2.queue=2 AND table2.status=0 THEN table2.id ELSE NULL END)AS count_2
        ,COUNT(DISTINCT CASE WHEN table2.queue=3 AND table2.status=0 THEN table2.id ELSE NULL END)AS count_3
        ,COUNT(DISTINCT CASE WHEN table2.queue=4 AND table2.status=0 THEN table2.id ELSE NULL END)AS count_4
    FROM current_table table2 JOIN alpha a ON table2.id=a.urid
GROUP BY a.min_agent)
   SELECT s.*
         ,s.count_1+s.count_2+s.count_3+s.count_4 AS total_count 
     FROM stats s 
 GROUP BY s.name
         ,s.count_1
         ,s.count_2
         ,s.count_3
         ,s.count_4 
  HAVING (s.count_1+s.count_2+s.count_3+s.count_4)>0 
ORDER BY total_count DESC

将代码以文本的形式发布在这里,而不是以图片的形式发布在其他地方。感谢您的建设性评论,我已经编辑了上面的帖子,将代码包含在文本中,并按照说明删除了指向代码的链接。对此表示歉意,我以前做过这件事,有一个问题得到了毫无疑问的回答。我希望这是足够的,并符合所有的准则,以得到一个问题的答案,任何其他请让我知道。此外,我的问题旁边有a-1,我做了大量的研究,并修改了我的观点,以确保它们是清晰的,尽可能清楚地解释一切。你能修改一下吗?对于这两个连接,你只会限制你的结果集,最后一个连接只会限制它到一行,我假设table_1::id是一个PK,它与你声称的子查询循环之类的东西不匹配感谢Adam,是的,你是正确的有两个id,历史表有一个操作id,当前表有一个id供查看(可以包含任意数量的操作)。我希望它做的是检查每个检查的子查询中的模式,然后将所有这些检查包括在主查询中指定的计数中。目前它只对满足子查询条件的第一个检查执行此操作。
WITH alpha AS 
(SELECT table1a.urid, (SELECT MIN(table1b.classifier) FROM historic_table table1b WHERE table1b.urid=table1a.urid) AS min_agent
   FROM historic_table table1a 
  WHERE table1a.queue=42
    AND table1a.tstamp>=(current_date-7))
,stats AS
 (SELECT a.min_agent AS name
        ,COUNT(DISTINCT CASE WHEN table2.queue=1 AND table2.status=0 THEN table2.id ELSE NULL END)AS count_1
        ,COUNT(DISTINCT CASE WHEN table2.queue=2 AND table2.status=0 THEN table2.id ELSE NULL END)AS count_2
        ,COUNT(DISTINCT CASE WHEN table2.queue=3 AND table2.status=0 THEN table2.id ELSE NULL END)AS count_3
        ,COUNT(DISTINCT CASE WHEN table2.queue=4 AND table2.status=0 THEN table2.id ELSE NULL END)AS count_4
    FROM current_table table2 JOIN alpha a ON table2.id=a.urid
GROUP BY a.min_agent)
   SELECT s.*
         ,s.count_1+s.count_2+s.count_3+s.count_4 AS total_count 
     FROM stats s 
 GROUP BY s.name
         ,s.count_1
         ,s.count_2
         ,s.count_3
         ,s.count_4 
  HAVING (s.count_1+s.count_2+s.count_3+s.count_4)>0 
ORDER BY total_count DESC