Atualmente tenho este SQL:
select ROW_NUMBER() OVER (order by priority DESC NULLS LAST,
created_at DESC) as index
, id
, title
, ago(created_at)
, priority
, user_id
from post
order by priority DESC NULLS LAST
, created_at DESC;
Como você pode ver, eu preciso ter ROW_NUMBER()
e isso precisa do
(order by priority desc nulls last, created_at desc) as index,
id, title, ago(created_at)
Isso está me fazendo repetir a mesma coisa por muito tempo
order by priority desc nulls last, created_at desc
duas vezes.
Se eu precisar ter ainda mais colunas na ordem, ela ficará ainda mais longa.
Existe uma maneira de evitar essa repetição? Tentei usar um alias depois do ORDER BY
mas isso não parece ser suportado.
Se você estiver procurando reutilizar a definição de janela, você pode defini-la separadamente usando
window w1 as(order by..)
, entãorow_number()over(..)
se tornarow_number()over w1
e você pode referenciar a mesma definição de janela de qualquer outra função de janela. Você também pode basear novas definições de janela na que você já tem.demo em db<>fiddle
Citando a
SELECT..WINDOW
cláusula doc :Quanto ao
order by
, no seu exemplo é suficiente classificar pelo número da linha que você gerou usando aquele que você tem, chegando à mesma ordem efetiva. Você pode repetir a expressão (usar o nome da janela poupa a repetição do seuorder by
), referenciá-la pelo alias ou pela posição ordinal. Citando o documento sobreSELECT..ORDER BY
cláusula :Há uma diferença importante no comportamento entre uma
order by
definição normal, externa e a interna de uma janela. Enquanto a primeira pode usar aliases e posições ordinais, a última não aceita um alias de coluna, mas, mais importante, números nela são aceitos, mas interpretados de forma diferente: a definição de janela entende números emorder by
como literais inteiros, não posições ordinais de coluna .Isso significa
over(order by 1)
que é tão útil quantoover(order by true)
,over(order by 'constant')
, ou apenasover()
.Basta ordenar pela primeira coluna:
Veja também o manual