Postgres - Como obter a posição do registro na tabela?

Como obter a posição do registro na tabela?

Isso é postgres?

SELECT 
    row_number() OVER(ORDER BY "id"),
    t.*
FROM NOME_TABELA AS t;
1 curtida

Mas por algum motivo os registros na minha tabela não estão nas posições que deveria está
o ID 5 era pra está na 2° posição
image

Já utilizou um SQL assim:

SELECT * FROM empresas ORDER BY empresa_id ASC

Você precisa detalhar melhor as suas duvidas, ficou vago demais o que perguntou e quando se pergunta algo tenha paciencia!

1 curtida

Uma grande questão nessa dúvida é para o que a posição do registro na tabela seria útil? (é mais um questionamento por curiosidade msm, não consigo pensar em algo para usar com essa informação)

1 curtida

Note que esse row_number não necessariamente vai sempre retornar a posição real do registro na tabela.
O row_number() retorna a posição dos resultados do select, então se adicionar um WHERE nessa query, por exemplo, o resultado vai vir quebrado para o seu caso.

2 curtidas

Mas utilizando tabela derivada resolve.

Select
T.posicao
From
(Select row_number() over() as posicao,
empresa_id
From empresas) T
Where
T.empresa_id = :empresa_id

1 curtida

Isso não tem lógica nenhuma … não precisa de Sub Query …

Porque você tem duas contas na rede social?

é um sub - query na FROM é desnecessário nesse exemplo, e não tem nada de tabela derivada se está falando coisa absurda …

Antes de chamar de absurdo, você deveria tentar executar a query que ele passou e entender porque faz diferença.

No exemplo que ele passou usando a tabela derivada (ou subquery) faz uma grande diferença.

Como eu vou executar uma SQL que só ele sabe o que está fazendo?
E na minha opinião a afirmação dele é um absurdo!

Ele fez uma Sub Query só isso! ai não demonstra nada de tabela derivada e sim um erro conceitual de escrever uma SQL e isso acontece nesse exemplo dado.

Ele que fez a pergunta e deu a resposta!

Você leu a thread inteira?

Ele colocou uma solução original baseada na resposta do @staroski .

Eu apontei um problema na solução dele, incluindo um link demonstrando o problema.

Ele então postou uma solução para o problema que apontei usando a tabela derivada/subquery.

Se você não consegue nem executar a query (tem um link para ela na minha resposta) como pode afirmar que ele tá errado?

Eu li, inclusive respondi e parece que não era por Order By!

A afirmação dele em cima da minha resposta que não estava certa, e a atitude dele de dizer que a SQL dele em um tabela derivada / sub query também não convenceu, porque, a resposta dele está errada e sim é um absurdo, utilizar um Sub Query do jeito que ele fez, e uma constatação.

Se ele vir aqui e demonstrar o problema e o que tentou fazer, eu tento resolver.

A query que você sugeriu está errada, porque não dá a solução que ele quer.

Ele postou uma query que resolve o problema dele. Como é que você diz que está errada?

Você já entendeu a diferença do que ele tá querendo e do que você sugeriu?

Isso eu sei inclusive nem rebati, só achei que a resposta dele não me convenceu, porque está errada!

Porque eu conheço o usuário a muito tempo e não é isso que aconteceu, inclusive na thread tem pessoa contestando a resposta dele.

Eu coloquei um exemplo de solução que ele disse que não estava correta, tudo bem, e ai por cima da minha resposta disse

E agora eu quero saber o que ele tentou fazer porque a resposta do outro usuário não precisa de sub query nem de tabela derivada

Seguinte @AbelBueno você não conhece todos os usuários, ele por exemplo tem outra conta! (inclusive está na thread e cara sério não adianta proteger não)

Não vou discutir mais já deu!

A pessoa “contestando” a resposta dele sou eu!

Eu não preciso conhecer os usuários para responder perguntas.
Me parece claro que @cleitonti e @Cleiton_Conceicao são a mesma pessoa, ele nem tá tentando esconder. Tanto é que ele respondeu ao @Lucas_Camara o que ele tava tentando fazer.

E como @Cleiton_Conceicao ele deu a resposta correta.

1 curtida

isso é um menção sua e não disse que não era para responder voce sempre disvirtua o papo

Não foi só você que contestou o Lucas também.

Sinceridade eu posso discordar da pessoa por uma resposta que ela deu e você também pode discorda de mim ou qualquer pessoa, vivemos num mundo dos contrários e respeitamos todas as opiniões, pra mim é um absurdo ele pegar a resposta dele e colocar no lugar da outra já dada como solução do problema, mas isso tudo é opinião.

Honestamente, eu já nem sei do que você tá falando.

Para ficar de referência a quem consultar depois.

A primeira solução com essa query:

Select row_number() over() as posicao,
    empresa_id
 From empresas

Não resolve o problema, pois quando um WHERE for utilizado, os valores de row_number irão mudar.

A solução para isso se resolve com a query abaixo:

Select
T.posicao
From
(Select row_number() over() as posicao,
empresa_id
From empresas) T
Where
T.empresa_id = :empresa_id

Que elimina o problema da anterior.

1 curtida