Pesquisa sem repetir um dos campos.
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.
[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
Curtidas 0
Respostas
Eriley Barbosa
23/09/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
GOSTEI 0
Alexandre Pedroso
23/09/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.
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.
GOSTEI 0
Eriley Barbosa
23/09/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.
GOSTEI 0
Alexandre Pedroso
23/09/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.
GOSTEI 0
Eriley Barbosa
23/09/2010
Você pode fazer uma stored procedure com uma tabela temporaria e preencher esta tabela como quiser.
GOSTEI 0
Alexandre Pedroso
23/09/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.
GOSTEI 0
Wilson Junior
23/09/2010
Mas você quer ordenar por Grupo, Data e Hora? Ou como você quer a ordenação?
GOSTEI 0
Jair N.
23/09/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
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
GOSTEI 0
Alexandre Pedroso
23/09/2010
Há como utilizar uma rotina compativel com esta no sql server 2000?
GOSTEI 0
Jair N.
23/09/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.
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.
GOSTEI 0
Alexandre Pedroso
23/09/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.
GOSTEI 0
Alexandre Pedroso
23/09/2010
Ola, alguem teria algum exemplo para sql server 2000?
GOSTEI 0
Alexandre Pedroso
23/09/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.
(
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.
GOSTEI 0