Array
(
)

Pesquisa sem repetir um dos campos.

Alexandre Pedroso
   - 23 set 2010

Bom dia.

É a primeira vez que posto um questionamento e peço paciencia caso eu não seja claro o bastante de inicio, sou iniciante em sql server e em contra partida muito interessado.

Bom meu problema é que tenho uma rotina que necessita que retorne apenas registros não repetidos em um campo especifico ou melhor .... um campo tem q ser agrupado, porem , desejo resgatar na pesquisa apenas os 6 ultimos registros.

Esta é a estrutura da tabela:

CREATE TABLE [dbo].[LOAD] (
  [LOAD_ID] int IDENTITY(1, 1) NOT NULL,
  [VALUES_ID] int NOT NULL,
  [GROUPS_ID] int NOT NULL,
  [CARNUMBER] int NOT NULL,
  [LOAD_DATA] datetime NULL,
  [LOAD_HORA] datetime NULL,
  PRIMARY KEY CLUSTERED ([LOAD_ID]),
  CONSTRAINT [LOAD_fk] FOREIGN KEY ([VALUES_ID])
  REFERENCES [dbo].[VALUES] ([VALUES_ID])
  ON UPDATE NO ACTION
  ON DELETE NO ACTION,
  CONSTRAINT [LOAD_fk2] FOREIGN KEY ([GROUPS_ID])
  REFERENCES [dbo].[GROUPS] ([GROUPS_ID])
  ON UPDATE NO ACTION
  ON DELETE NO ACTION

Aqui um exemplo do resultado de pesquisa de todas as informações da tabela.

LOAD_ID     VALUES_ID     GROUPS_ID     CARNUMBER            LOAD_DATA         LOAD_HORA              12            35115                    3             234553    17/9/2010 00:00   1/1/1900 15:58            13            35105                    2            4574567   17/9/2010 00:00   1/1/1900 16:21                                        14            35117                    3        546745675   17/9/2010 00:00   1/1/1900 16:21                           15            35106                    1              467567   17/9/2010 00:00   1/1/1900 16:22                            19            35114                    3              423434   17/9/2010 00:00   1/1/1900 15:54                              23            35144                    2                45235   19/9/2010 00:00   1/1/1900 19:50                              25            35149                    2                42535   20/9/2010 00:00   1/1/1900 11:53            26            35150                    3                42343  20/9/2010 00:00   1/1/1900 12:10              35            35157                    6               345646  20/9/2010 00:00   1/1/1900 19:02                              36            35158                    5               234123  20/9/2010 00:00   1/1/1900 19:06            37            35159                    6               111444  20/9/2010 00:00   1/1/1900 19:06                              38            35160                    4                 99895  20/9/2010 00:00   1/1/1900 19:06                              39            35161                    3           42343434  20/9/2010 00:00   1/1/1900 19:28             40            35162                    4               423411  20/9/2010 00:00   1/1/1900 19:28                                       41            35163                    5                 66534  20/9/2010 00:00   1/1/1900 19:28              42            35164                    6               323455  20/9/2010 00:00   1/1/1900 19:28            43             35165                    4                 88880  20/9/2010 00:00   1/1/1900 19:29   Esta é a rotina que uso para pegar os ultimos 6 registro:

select top 6  * from LOAD

ORDER BY LOAD_DATA desc, LOAD_HORA desc

O campo que preciso ordenar e agrupar é o GROUPS_ID.

Alguem teria uma luz ou solução hehehehe , já estou a algum tempo tentando solucionar pois gostaria de fazê-lo todo em sql. Uso Sql Server 2005.
 Na realidade eu realmente gostaria de que ele selecionasse os ultimos 6 registros , porem,  com o campo GROUPS_ID em ordem crescente 1,2,3,4,5,6 e que cada registro correspondente ao campo GROUPS_ID fosse o ultimo a ser inserido.

Eriley Barbosa
   - 23 set 2010

Agrupar não é possivel, pois, o group by só funciona com uma função de agregação(avg, count, sum, mim, max). Mas inclua o campo GROUPS_ID no order by:

select top 6  * from LOAD

ORDER BY GROUPS_ID  desc, LOAD_DATA desc, LOAD_HORA desc

Alexandre Pedroso
   - 23 set 2010

Obrigado por responder.

Acredito que não fui bem claro, mesmo pq ainda não descobri como colocar esta necessidade de forma clara , mas dxa eu tentar denovo hehehehe

Gostaria de receber os ultimos 6 registos em ordem pelo campo PLC_GROUPS_ID.

Exemplo:

PLC_LOAD_ID  PLC_VALUES_ID PLC_GROUPS_ID      PLC_CARNUMBER     PLC_LOAD_DATA     PLC_LOAD_HORA  
   12,000000    35115,000000            1,000000         234553,000000     17/9/2010 00:00    1/1/1900 15:58    
   13,000000   35105,000000             2,000000      74574567,000000      17/9/2010 00:00    1/1/1900 16:21    
   14,000000   35117,000000             3,000000    546745675,000000      17/9/2010 00:00    1/1/1900 16:21    
   15,000000   35106,000000             4,000000         467567,000000      17/9/2010 00:00    1/1/1900 16:22    
   19,000000   35114,000000             5,000000        423434,000000      17/9/2010 00:00    1/1/1900 15:54    
   23,000000   35144,000000             6,000000          45235,000000      19/9/2010 00:00    1/1/1900 19:50    
   25,000000   35149,000000             2,000000           42535,000000     20/9/2010 00:00    1/1/1900 11:53    
   26,000000   35150,000000             3,000000           42343,000000      20/9/2010 00:00    1/1/1900 12:10    
   35,000000   35157,000000             6,000000         345646,000000     20/9/2010 00:00    1/1/1900 19:02  

Peguei alguns registros acima e modifiquei o campo PLC_GROUPS_ID. E claro que na pesquisa deveria retornar em sequencia ou não porem o ultimo registro de cada resultado do campo PLC_GROUPS_ID.

Eriley Barbosa
   - 23 set 2010

Sim, o select que te passei faz isso, qualquer coisa rode o select e post a imagem do resultado aqui, para que eu possa entender melhor o que queres.

Alexandre Pedroso
   - 23 set 2010

Na realidade não preciso apenas agrupar, necessito de que seja listado o campo PLC_GROUPS_ID em ordem 1,2,3,4,5,6 e o restante dos campo tenham relação com estes registros . Porem como disse antes os ultimos 6 , tentei fazer isto com cross apply , mas ñ deu certo.

Eriley Barbosa
   - 23 set 2010

Você pode fazer uma stored procedure com uma tabela temporaria e preencher esta tabela como quiser.

Alexandre Pedroso
   - 23 set 2010

Te agradeço pela ajuda, porém realmente gostaria de alguma direção para servir de partida.

Acredito que é possivel fazer em uma unica rotina sql.

Wilson Paulista...!!!
   - 24 set 2010

Mas você quer ordenar por Grupo, Data e Hora? Ou como você quer a ordenação?

Jair A.n.
   - 24 set 2010

Bem, MSSQL-2005 veja um exemplo se te ajuda:

  SELECT sq_load.*
    FROM (    
  SELECT num_ped_entra,qtd, DENSE_RANK()
    OVER (PARTITION BY values_id
            ORDER BY groups_id DESC
                   , load_data DESC
                   , load_hora DESC) ranking
    FROM load
       ) sq_load
   WHERE (ranking BETWEEN 1 AND 6)
ORDER BY ranking

Alexandre Pedroso
   - 24 set 2010

Há como utilizar uma  rotina compativel com esta no sql server 2000?

Jair A.n.
   - 24 set 2010

Boa Tarde, desculpe seria mais ou menos desta maneira 

SELECT sq_load.*
    FROM (   
  SELECT *, DENSE_RANK()
    OVER (PARTITION BY groups_id
              ORDER BY load_data DESC
                     , load_hora DESC) ranking
    FROM dbo.LOAD_TB
       ) sq_load
   WHERE (ranking BETWEEN 1 AND 6)
ORDER BY groups_id, ranking

Resondendo sua pergunta:  "não é compativel com versões anteriores ao MSSQL 2005" perfeita no 2008.

Alexandre Pedroso
   - 24 set 2010

Ok, mto obrigado , porem alguem tem alguma ideia de como converter este codigo para Sql Server 2000? Eu preciso para os dois casos , sql server 2000 e sql server 2005.

Alexandre Pedroso
   - 26 set 2010

Ola, alguem teria algum exemplo para sql server 2000?

Alexandre Pedroso
   - 27 set 2010

Para finalizar o post.... Esta foi a solução enviada por Marcelo Fernandes no forum msdn- sql server.   select * from
(
  select top 6 * from PLC_LOAD
  ORDER BY PLC_LOAD_DATA desc, PLC_LOAD_HORA desc
)
order by PLC_GROUPS_ID
  Post finalizado e obrigado a todos.