Pesquisa sem repetir um dos campos.

23/09/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.

Alexandre Pedroso

Respostas

23/09/2010

Eriley Barbosa

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
Responder Citar

23/09/2010

Alexandre Pedroso

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.
Responder Citar

23/09/2010

Eriley Barbosa

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.
Responder Citar

23/09/2010

Alexandre Pedroso

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.
Responder Citar

23/09/2010

Eriley Barbosa

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

23/09/2010

Alexandre Pedroso

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.
Responder Citar

24/09/2010

Wilson Paulista...!!!

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

24/09/2010

Jair A.n.

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

Responder Citar

24/09/2010

Alexandre Pedroso

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

24/09/2010

Jair A.n.

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.
Responder Citar

24/09/2010

Alexandre Pedroso

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.
Responder Citar

26/09/2010

Alexandre Pedroso

Ola, alguem teria algum exemplo para sql server 2000?
Responder Citar

27/09/2010

Alexandre Pedroso

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.
Responder Citar