postgresql – 结合两个类似的SQL查询

我使用以下SQL查询两次使用不同的限制值.在我的情况下,40和100,虽然它并不重要.我的问题是 – 我可以将这两个查询合并到一个查询中吗?它可能会更快. sample是一个PG数组.

我不知道还需要多少信息,但如果您需要更多详细信息,请询问.除非必要,否则我不愿意添加有关架构的详细信息,因为它会使问题更长.

SELECT   SUM(motif)
FROM     (SELECT    ROW_NUMBER() OVER (PARTITION BY crossvalnum ORDER BY crossvalnum, pvalue DESC, margstat) AS r,
                    (seqindex IS NOT NULL)::INTEGER                                                        AS motif,
                    crossval.crossvalnum,
                    data.margstat,
                    data.pvalue
         FROM       data
                    INNER JOIN datasubgroup
                    ON         data.datasubgroup_id=datasubgroup.id
                    INNER JOIN crossval
                    ON         datasubgroup.crossval_id=crossval.id
         WHERE      data.seqindex                      =ANY(crossval.sample)
         OR         data.seqindex                  IS NULL
         )
         AS q
WHERE    q.r <= limit
GROUP BY crossvalnum;

40的值是

sum 
-----
  25
  22
  19
  16
  24
(5 rows)

100的值是

sum 
-----
  32
  28
  24
  23
  31
(5 rows)

更新:motif被定义为一个指示变量,(seqindex IS NOT NULL):: INTEGER. SUM与GROUP BY crossvalnum对应作为聚合查询.因此总和发生在每个crossvalnum组中.因此聚合查询中有一个窗口函数.我希望输出是两列.

最佳答案
它会对你有用吗?

SELECT SUM(CASE WHEN r <=LEAST(40,100) THEN motif ELSE 0 END) as sum1,
SUM(motif) as sum2
FROM (...) q  -- or AS q , whatever version you prefer
WHERE    q.r <= GREATEST(40,100)
GROUP BY crossvalnum;

转载注明原文:postgresql – 结合两个类似的SQL查询 - 代码日志