Usuário com melhor resposta
Select de Linhas Consecutivas Incrementais

Pergunta
-
Boa Noite,
eu tenho um banco de dados em que as linhas contém uma coluna numérica consecutiva. Quero fazer um select da agrupando as linhas aonde o intervalo não é interrompido.
Meu banco de dados consiste em:
CREATE TABLE SerialsDB.dbo.Prefixes (pfId INT IDENTITY NOT NULL CONSTRAINT PK_Prefixes PRIMARY KEY (prId), pfPrefix VARCHAR(3) NOT NULL CONSTRAINT UK_Prefixes_Prefix UNIQUE KEY (prPrefix)) ON [primary] CREATE TABLE SerialsDB.dbo.Entries (enId INT IDENTITY NOT NULL CONSTRAINT PK_Entries PRIMARY KEY (enId), enPrefix INT NOT NULL CONSTRAINT FK_Entries_Prefixes FOREIGN KEY (enPrefix) REFERENCES SerialsDB.dbo.Prefixes (pfId) ON DELETE NO ACTION ON UPDATE NO ACTION, enNumber INT NOT NULL, CONSTRAINT UK_Entries_Number UNIQUE KEY (enPrefix, enNUmber),
enOrder NVARCHAR(10)) ON [primary]Agora, a coluna "enNumber" é o número seguencial, mas ele é seguencial apenas para um mesmo Prefixo, em "enPrefix".
Os dados da tabela seriam algo assim:PREFIXES (pfId, pfPrefix)
1 ABC
2 CDE
3 FGH
4 IJKENTRIES (enId, enPrefix, enNumber, enOrder)
1 2 1 '120-4'
2 2 2 '120-4'
3 2 3 '120-4'
4 2 4 '120-4'
5 2 5 '120-4'
6 4 1 '120-4'
7 4 2 '120-4'
8 4 3 '120-4'
9 3 1 '3600'
10 3 2 '3600'
11 3 3 '4000'
12 3 4 '4000'
13 3 5 '4000'
14 3 6 '4000'Com isso, eu quero que o select me retorn um "De-Até", agrupando por "enPrefix" e "enOrder".
O resultado esperado com a tabela acima seria:
RESULT (enPrefix, [De], [To], enOrder)
2 1 5 '120-4'
4 1 3 '120-4'
3 1 2 '3600'
3 3 6 '4000'Como faria esse Select?
Respostas
-
Encontrei a resposta depois de testar um pouco consultas com GROUP BY no meu banco de dados.
Cheguei a isso:
SELECT enPrefix, MIN(enNumber) AS [From], MAX(enNumber) AS [To], enOrder enDate, enNfe FROM SerialsDB.dbo.Entries WHERE enStatus = 4 AND NOT enOrder IS NULL GROUP BY enOrder, enPrefix, enDate, enNfe ORDER BY enPrefix ASC, [From] ASC
* Com as colunas que omiti do exemplo por não serem relevantes.
- Marcado como Resposta SammuelMiranda domingo, 15 de fevereiro de 2015 23:38
Todas as Respostas
-
Encontrei a resposta depois de testar um pouco consultas com GROUP BY no meu banco de dados.
Cheguei a isso:
SELECT enPrefix, MIN(enNumber) AS [From], MAX(enNumber) AS [To], enOrder enDate, enNfe FROM SerialsDB.dbo.Entries WHERE enStatus = 4 AND NOT enOrder IS NULL GROUP BY enOrder, enPrefix, enDate, enNfe ORDER BY enPrefix ASC, [From] ASC
* Com as colunas que omiti do exemplo por não serem relevantes.
- Marcado como Resposta SammuelMiranda domingo, 15 de fevereiro de 2015 23:38
-
-
Olá José, obrigado por acrescentar coisas em meu conhecimento.
Eu não sei se vou precisar do "over partition" porque se houver alteração em qualquer um dos campos (enOrder, enNfe ou enDate) por qualquer motivo (o que não deve ocorre muito, mas pode), então o MIN e MAX realmente devem mudar de acordo.
Pelo que entendi o "over partition" ao invés de "group by" preveniria essa mudança certo? Se for isso então não irei usar nesse caso, mas é bom saber que se eu quiser o MIN e MAX com foco em colunas sem independentes do agrupamento eu já sei como.
-