Estou usando a seguinte consulta SQL duas vezes com valores diferentes de limit
. No meu caso, 40 e 100, embora isso realmente não importe. Minha pergunta é: posso combinar essas duas consultas em uma consulta? Provavelmente seria mais rápido. sample
é uma matriz PG.
Não sei quantas informações adicionais são necessárias, mas se precisar de mais detalhes, pergunte. Estou relutante em adicionar detalhes sobre o esquema, a menos que seja necessário, pois isso tornará a pergunta muito mais longa.
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;
O valor de 40 é
sum
-----
25
22
19
16
24
(5 rows)
O valor de 100 é
sum
-----
32
28
24
23
31
(5 rows)
Update: motif
é definido como uma variável indicadora, (seqindex IS NOT NULL)::INTEGER
. O SUM
corresponde a GROUP BY crossvalnum
como uma consulta agregada. Portanto, a soma ocorre em cada grupo crossvalnum. Portanto, há uma função de janela dentro de uma consulta agregada. Eu quero que a saída seja duas colunas.
Se bem entendi, a consulta faz uma contagem no
greatest-n-per-row
tipo de consulta onden
leva 2 valores (40 e 100).Provavelmente, isso pode ser resolvido melhor reescrevendo a subconsulta. O mais fácil de escrever pode ser fazer uma junção de duas consultas:
Aqui está outra maneira de mover as contagens dentro da subconsulta:
Será que vai trabalhar para você ?