none
Select de Linhas Consecutivas Incrementais RRS feed

  • 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 IJK

    ENTRIES (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?

    domingo, 15 de fevereiro de 2015 22:03

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
    domingo, 15 de fevereiro de 2015 23:38

Todas as Respostas