[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.
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á…
[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.
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
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 !
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]