[RESOLVIDO] Consulta Transact-SQL (SQL Server)

Tenho a seguinte tabela:

[code]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
[/code]
Quero selecionar apenas uma linha de cada ocorrência (assim como um possível resultado de consulta abaixo):

[code]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
[/code]

Alguém sabe como fazer ?

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

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

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.

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

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[/quote]

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.

[quote]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.[/quote]

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/

[quote=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.[/quote]

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.

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

[quote=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[/quote]

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

Abraço.

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.

[quote=AbelBueno][quote=jMarcel]
Putz, muito bem lembrado ! Tinha me esquecido da função rank() mesmo !
[/quote]

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.[/quote]

Boa. E empataram mesmo ! Valeu pela dica.