SQL - Selecionar Range a partir de um ID

SQL

Firebird

17/02/2020

Preciso de um select que me retorne os X registros depois do registro de ID = Y, respeitando o order by NOME.

Exemplificando.

Objetivo: Quero 5 registros depois do ID 54;

Resultado:

74 - Antonio Figueredo Lemos

76 - Cristiane Santos Silva

59 - Eliane Martins Ribeiro

58 - Elson Alves Pereira

64 - Fagna Feliciano da Silva

Alguém me ajuda?

Image de exemplo: https://i.stack.imgur.com/S5H6t.png
Joao

Joao

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

18/02/2020

pode ser assim, se você sabe a partir de qual linha deseja apresentar os registros:
SELECT FIRST 3 -- AQUI VOCÊ INDICA QUANTOS REGISTROS QUER APRESENTAR
	TAB.ID, TAB.NOME
FROM (
SELECT
	(SELECT COUNT(T2.NOME) FROM TABELA T2 WHERE T2.NOME <= T.NOME) LINHA,
	T.ID, T.NOME
FROM
	TABELA T
ORDER BY
	T.NOME
) TAB
WHERE TAB.LINHA >= 3 -- AQUI VOCÊ INDICA A PARTIR DE QUAL LINHA QUER APRESENTAR

ou assim, se você não sabe o número da linha e tem somente o ID:
SELECT FIRST 3 -- AQUI VOCÊ INDICA QUANTOS REGISTROS QUER APRESENTAR
	TAB.ID, TAB.NOME
FROM (
SELECT
	(SELECT COUNT(T2.NOME) FROM TABELA T2 WHERE T2.NOME <= T.NOME) LINHA,
	T.ID, T.NOME
FROM
	TABELA T
ORDER BY
	T.NOME
) TAB
WHERE TAB.LINHA >= 
	(SELECT T3.LINHA FROM (
		SELECT
			(SELECT COUNT(T2.NOME) FROM TABELA T2 WHERE T2.NOME <= T.NOME) LINHA,
			T.ID, T.NOME
		FROM
			TABELA T
		ORDER BY
			T.NOME
		) T3
	WHERE T3.ID = 76) -- AQUI VOCÊ INDICA O ID QUE QUER USAR COMO FILTRO

GOSTEI 2

Mais Respostas

Emerson Nascimento

Emerson Nascimento

17/02/2020

Firebird
SELECT FIRST 5 * 
FROM TABELA
WHERE ID > 54
ORDER BY NOME

SQL Server
SELECT TOP 5 * 
FROM TABELA
WHERE ID > 54
ORDER BY NOME
GOSTEI 0
Joao

Joao

17/02/2020

Firebird
SELECT FIRST 5 * 
FROM TABELA
WHERE ID > 54
ORDER BY NOME

SQL Server
SELECT TOP 5 * 
FROM TABELA
WHERE ID > 54
ORDER BY NOME


Agradeço pela resposta Emerson, porém esse select não funciona. No caso desse resultado aqui:

74 - Antonio Figueredo Lemos

76 - Cristiane Santos Silva

59 - Eliane Martins Ribeiro

58 - Elson Alves Pereira

64 - Fagna Feliciano da Silva

O select só ia pegar os IDs menores que 54, ou seja ia eliminar todos os registros acima.

GOSTEI 0
Emerson Nascimento

Emerson Nascimento

17/02/2020

você testou?

porque a condição diz pra pegar os registros cujo ID seja MAIOR que 54, então não entendi quando você diz que
O select só ia pegar os IDs menores que 54, ou seja ia eliminar todos os registros acima
GOSTEI 0
Joao

Joao

17/02/2020

você testou?

porque a condição diz pra pegar os registros cujo ID seja MAIOR que 54, então não entendi quando você diz que
O select só ia pegar os IDs menores que 54, ou seja ia eliminar todos os registros acima


Ah, perfeito, saquei! Porém mesmo assim ainda não dá, porque pode ter um registro que tenha o ID menor que 54 mas que faça parte do resultado por estar em ordem alfabética, logo será eliminado :/

Por exemplo:

Essa é a ordenação por NOME

76 - Cristiane Santos Silva
59 - Eliane Martins Ribeiro
58 - Elson Alves Pereira
64 - Fagna Feliciano da Silva

Caso eu queira os 3 registros depois do ID 76, o resultado seria esse:

59 - Eliane Martins Ribeiro
58 - Elson Alves Pereira
64 - Fagna Feliciano da Silva

Porém com seu código ele eliminaria todos esses, pois todos os ID são menores que 76.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

17/02/2020

Ah... Agora entendi tua necessidade. Peraí que vou pensar em algo.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

17/02/2020

no lugar de
(SELECT COUNT(T2.NOME) FROM TABELA T2 WHERE T2.NOME <= T.NOME) LINHA,

você pode colocar
ROW_NUMBER() OVER (ORDER BY T.NOME) LINHA,
GOSTEI 0
Joao

Joao

17/02/2020

no lugar de
(SELECT COUNT(T2.NOME) FROM TABELA T2 WHERE T2.NOME <= T.NOME) LINHA,

você pode colocar
ROW_NUMBER() OVER (ORDER BY T.NOME) LINHA,


Agora deu certo, muito obrigado amigo :D
GOSTEI 0
POSTAR