2013-08-02 6 views
1

NameCode 두 개의 문자열 열이있는 테이블이 있습니다. Code은 고유하지만 Name은 고유하지 않습니다. 샘플 데이터 : 나는 독특한 작은 Code 값을 가진 행,하지만 숫자 값의 측면에서을 선택합니다최소 길이 값을 가진 행만 선택하여 중복 행 제거

Name  Code 
-------- ---- 
Jacket 15 
Jeans  003 
Jeans  26 

; 오히려 문자열의 길이. 물론이 작동하지 않습니다

SELECT Name, Min(Code) as Code 
FROM Clothes 
GROUP BY Name, Code 

위의 코드는 같은 청바지 하나 개의 행을 반환합니다

때문에 숫자로, 올바른
Jeans | 003 

, 00326 이하이다. 그러나 실제 가치가 아니라 가치의 길이에 관심을 갖는 제 신청서에는 없습니다. 길이가 3자인 값은 2자를 갖는 값보다 큽니다. 나는 실제로이를 반환해야합니다 26의이 길이 003보다 짧은

Jeans | 26 

길이 때문입니다.

그래서 실제 최소값이 아닌 최소 길이의 코드를 가진 행을 선택할 SQL 코드를 어떻게 작성합니까? 나는이 일을 시도 :

SELECT Name, Min(Len(Code)) as Code 
FROM Clothes 
GROUP BY Name, Code 

을 나는이와 끝까지 그래서 위의 단 하나의 문자 나 반환

당신이 코드 필드의 숫자 값을 정렬하려고하는 것 소리
Jeans | 2 
+5

@Malachi, 그건 끔찍한 편집이다. 그는 길이가 최소 인 것을 원하며 3 자리 숫자의 * 예제 *를 사용한다고 말하고 있습니다. 그가 '00005'와 '5555'라는 코드가있는 다른 종류의 옷을 가지고 있다면 그는 4 자리 숫자로 된 옷을 원할 것입니다. 시도해 보지 말고 OP에 대해 생각해보십시오. 편집은 거절되어야하지만 분명히 세 명의 승인자가주의를 기울이지 않았습니다. 또한 첫 번째 단락을 제거하지 않는 이유는 무엇입니까 ??? –

+0

동의합니다. 사과드립니다. 가장 중요한 것은 OP가 코드 길이가 데이터의 표준보다 적은 코드를 찾으려고한다는 것이 사람들에게 충분히 분명하지 않다는 것입니다. 나는 선들 사이를 읽었고 주어진 정보를 토대로 그 점을 명백하게 만들었다 고 생각했습니다. 주어진 편집 결과가 정확하게 표시됩니다. – Malachi

답변

4
;WITH cte AS 
(
    SELECT Name, Code, rn = ROW_NUMBER() 
    OVER (PARTITION BY Name ORDER BY LEN(Code)) 
    FROM dbo.Clothes 
) 
SELECT Name, Code 
FROM cte 
WHERE rn = 1; 

SQLfiddle demo

, 선택은 임의 될 것입니다보십시오 order by 절, 예.

OVER (PARTITION BY Name ORDER BY LEN(Code), CONVERT(INT, Code) DESC) 

SQLfiddle demo

+0

멋지게 완료되었습니다 - 감사합니다! 나는 "; WITH WITH cte AS"구문을 처음 접한 적이 없습니다. 나는 많은 SQL 서적을 가지고 있지만, 처음부터 무엇을 찾아야할지 모르기 때문에 어떤 장을보아야하는지 알지 못했습니다. 대답으로 투표. –

+0

@volumeone 이는 공통 테이블 표현식입니다. 이 경우 필수적인 것은 아니지만 파생 된 테이블보다 쉽게 ​​따라 할 수 있습니다. "여기 내가 확인하고있는 것들이 있는데, 이제는 그 세트로 무엇을 할 것인가." –

0

. 그렇다면 올바른 접근법은 INT로 먼저 캐스팅 한 다음 하위 쿼리의 sort/min 함수에 사용하고 기본 쿼리 절에서 원래 코드를 선택하는 것입니다. 당신이 추가를 추가하여 넥타이를 깰 수 있도록

+0

아니요, 숫자 값의 * 길이 *로 정렬하려고합니다. –

+0

@AaronBertrand, "최소"코드 "값으로 고유 한 행을 선택하고 싶습니다." OP가 인정한 것처럼 질문의 표현에도 불구하고 실제 요구 사항으로 혼란 스럽다. – JeffSahol

+0

''최소 길이, 실제 최소값을 선택하지 않을 것입니다 '와'Name, Min (Len (Code))'을 사용하려고합니다. –

1

, 같은 길이를 공유하는 코드의 여러 값이있는 경우이

select clothes.name, MIN(code) 
from clothes 
    inner join 
    (
     SELECT 
      Name, Min(Len(Code)) as CodeLen 
     FROM 
      clothes 
     GROUP BY 
     Name 
    ) results 
on clothes.name = results.name 
and LEN(clothes.code) = results.CodeLen 
group by clothes.name