[RESOLVIDO] Consulta Transact-SQL (SQL Server)

9 respostas
jMarcel

Tenho a seguinte tabela:

codigo	nome	endereco	codX	codY
-----------------------------------------------------
123	   aaa     rua xxx		1111	2222
123	   aaa     rua xxx		3333	4444
123	   aaa     rua xxx		5555	6666
123	   aaa     rua xxx		7777	8888
456	   bbb     rua yyy		9999	0000
456	   bbb     rua yyy		1212	3434
456	   bbb     rua yyy		5656	7878
789	   ccc	   rua zzz		9090	1010
012	   ddd     rua ttt		3141	1413
013	   eee     rua www		4132	8080
Quero selecionar apenas uma linha de cada ocorrência (assim como um possível resultado de consulta abaixo):
codigo	nome	endereco	codX	codY
-----------------------------------------------------
123	   aaa     rua xxx		1111	2222



456	   bbb     rua yyy		9999	0000


789	   ccc	   rua zzz		9090	1010
012	   ddd     rua ttt		3141	1413
013	   eee     rua www		4132	8080

Alguém sabe como fazer ?

9 Respostas

A

jMarcel:
Quero selecionar apenas uma linha de cada ocorrência (assim como um possível resultado de consulta abaixo):

Qual o critério de desempate para selecionar uma linha?

Explicando minha dúvida:
Para o código 123 você pegou a linha com o menor codX e menor codY
Para o código 456 você pegou a linha com o maior codX e maior codY

tondatto

SELECT DISTINCT(t.[codigo]) ,t2.[nome] ,t2.[endereco] ,t2.[codX] ,t2.[codY] FROM [table] AS t JOIN (SELECT TOP 1 * FROM [table] WHERE [table].[codigo] = t.[codigo]) AS t2 ON t.[codigo] = t2.[codigo]
Não testei, mas a lógica seria +/- essa.

jMarcel

AbelBueno:
jMarcel:
Quero selecionar apenas uma linha de cada ocorrência (assim como um possível resultado de consulta abaixo):

Qual o critério de desempate para selecionar uma linha?

Explicando minha dúvida:
Para o código 123 você pegou a linha com o menor codX e menor codY
Para o código 456 você pegou a linha com o maior codX e maior codY

Olá.

O critério pode ser qq um (min ou max, tanto faz) desde que retorne apenas 1 linha de cada ocorrência.
Esse ex eu fiz sem levar em conta min ou max.

A

Olá.

O critério pode ser qq um (min ou max, tanto faz) desde que retorne apenas 1 linha de cada ocorrência.
Esse ex eu fiz sem levar em conta min ou max.

Hum… a falta de critérios torna um pouco mais complexa a coisa.

Dá uma olhada neste post e tire algumas idéias de lá…

http://gustavomaiaaguiar.wordpress.com/2009/01/11/como-retornar-o-ultimo-registro-por-grupo/

jMarcel

tondatto:
SELECT DISTINCT(t.[codigo]) ,t2.[nome] ,t2.[endereco] ,t2.[codX] ,t2.[codY] FROM [table] AS t JOIN (SELECT TOP 1 * FROM [table] WHERE [table].[codigo] = t.[codigo]) AS t2 ON t.[codigo] = t2.[codigo]
Não testei, mas a lógica seria +/- essa.

Sempre que vc usa TOP [N], retorna-se apenas a [N]ésima linha da tabela onde a condição for TRUE, inclusive se houver alguma condição. Ou seja, conforme vc colocou, obteve-se apenas 1 linha da tabela.

Mas, mesmo assim, obrigado pela atenção, colega.

tondatto

Pois é. Viajei.

Acredito que você soluciona trabalhando com rankiamento:

SELECT [codigo], [nome], [endereco], [codx], [cody] FROM ( SELECT [codigo], [nome], [endereco], [codx], [cody] ,RANK() OVER (PARTITION BY [codigo] ORDER BY [codx]) rownumber FROM [teste] ) t WHERE rownumber = 1

jMarcel

tondatto:
Pois é. Viajei.

Acredito que você soluciona trabalhando com rankiamento:

SELECT [codigo], [nome], [endereco], [codx], [cody] FROM ( SELECT [codigo], [nome], [endereco], [codx], [cody] ,RANK() OVER (PARTITION BY [codigo] ORDER BY [codx]) rownumber FROM [teste] ) t WHERE rownumber = 1

Putz, muito bem lembrado ! Tinha me esquecido da função rank() mesmo !
Cara, funcionou. Eu te agradeço. Obrigado mesmo, hein !

Abraço.

A

Só um detalhe: a Rank permite empates, ou seja, se o codx for igual você ficará com duas linhas para o mesmo código.
(Não sei se pela sua modelagem é possível a repetição do codx)

Você pode usar a Row_Number para gerar números únicos por linha.

jMarcel

AbelBueno:
jMarcel:

Putz, muito bem lembrado ! Tinha me esquecido da função rank() mesmo !

Só um detalhe: a Rank permite empates, ou seja, se o codx for igual você ficará com duas linhas para o mesmo código.
(Não sei se pela sua modelagem é possível a repetição do codx)

Você pode usar a Row_Number para gerar números únicos por linha.

Boa. E empataram mesmo ! Valeu pela dica.

Criado 23 de setembro de 2011
Ultima resposta 27 de set. de 2011
Respostas 9
Participantes 3