복붙노트

[SQL] 컬럼의 각 고유 값에 대한 첫 번째 행을 선택하는 방법

SQL

컬럼의 각 고유 값에 대한 첫 번째 행을 선택하는 방법

의 내가 고객의 주소 테이블이 있다고 가정 해 봅시다 :

CName           |   AddressLine
-------------------------------
John Smith      | 123 Nowheresville
Jane Doe        | 456 Evergreen Terrace
John Smith      | 999 Somewhereelse
Joe Bloggs      | 1 Second Ave

표에서, 존 스미스와 같은 한 고객이 여러 개의 주소를 사용할 수 있습니다. 이 테이블은 첫 번째 행은 'CNAME'에 중복이있는 곳을 발견 반환 할 내가 선택 쿼리가 필요합니다. 이 테이블은 3을 제외한 모든 행을 반환해야합니다 (또는 1 - 두 주소 중 하나를 좋아하지만 단 하나의 반환 할 수 있습니다). 나는 서버가 이미 전에 열 값을 볼 수 있는지 여부에 따라 필터에 SELECT 쿼리에 추가 할 수있는 키워드가 있습니까?

해결법

  1. ==============================

    1.아주 간단한 대답 당신은 당신이 사용하는 주소 상관 없어 말한다면.

    아주 간단한 대답 당신은 당신이 사용하는 주소 상관 없어 말한다면.

    SELECT
        CName, MIN(AddressLine)
    FROM
        MyTable
    GROUP BY
        CName
    

    첫 번째에 따라 원하는 경우 말,에 "삽입"열은 다음 다른 쿼리

    SELECT
        M.CName, M.AddressLine,
    FROM
        (
        SELECT
            CName, MIN(Inserted) AS First
        FROM
            MyTable
        GROUP BY
            CName
        ) foo
        JOIN
        MyTable M ON foo.CName = M.CName AND foo.First = M.Inserted
    
  2. ==============================

    2.SQL 2K5 +, 당신은 뭔가를 같이 할 수 있습니다 :

    SQL 2K5 +, 당신은 뭔가를 같이 할 수 있습니다 :

    ;with cte as (
      select CName, AddressLine,
      rank() over (partition by CName order by AddressLine) as [r]
      from MyTable
    )
    select CName, AddressLine
    from cte
    where [r] = 1
    
  3. ==============================

    3.당신은 행의 행 번호를 얻을 수 ROW_NUMBER ()를 사용할 수 있습니다. 그것은 오버 명령을 사용하여 - 절을 지정하여 파티션이 때 번호와에 행 번호를 주문하는 것을 선택하여 순서를 다시 시작합니다. 당신이 당신의 쿼리의 말에 의해 주문을 추가하더라도 번호 때 이상의 명령 순서를 보존하는 것입니다.

    당신은 행의 행 번호를 얻을 수 ROW_NUMBER ()를 사용할 수 있습니다. 그것은 오버 명령을 사용하여 - 절을 지정하여 파티션이 때 번호와에 행 번호를 주문하는 것을 선택하여 순서를 다시 시작합니다. 당신이 당신의 쿼리의 말에 의해 주문을 추가하더라도 번호 때 이상의 명령 순서를 보존하는 것입니다.

    select *
    from mytable
    where row_number() over(partition by Name order by AddressLine) = 1
    
  4. ==============================

    4.당신은 너무 같은 (기준 ... 파티션) 구문을 통해 ROW_NUMBER ()를 사용할 수 있습니다 :

    당신은 너무 같은 (기준 ... 파티션) 구문을 통해 ROW_NUMBER ()를 사용할 수 있습니다 :

    select * from
    (
    select *
    , ROW_NUMBER() OVER(PARTITION BY CName ORDER BY AddressLine) AS row
    from myTable
    ) as a
    where row = 1
    

    이것이 않는 것은 카운터 인 행라는 열을 생성하는 것입니다 그 단위가 동일한 CNAME 및 인덱스 AddressLine에 의해 그 발생을 볼 때마다. 부과함으로써 열 = 1, 하나는 그의 제 AddressLine 알파벳순 오는 CNAME를 선택할 수있는. 순서로는 내림차순 있었다면, 그것은 누구의 AddressLine 마지막 알파벳 오는 CNAME을 선택합니다.

  5. ==============================

    5.이렇게하면 각 중복 행 한 행을 줄 것이다. 그것은 또한 당신에게 비트 유형 열을 줄 것이다, 그리고 MS SQL 서버에 이상에서 작동합니다.

    이렇게하면 각 중복 행 한 행을 줄 것이다. 그것은 또한 당신에게 비트 유형 열을 줄 것이다, 그리고 MS SQL 서버에 이상에서 작동합니다.

    (select cname, address 
    from (
      select cname,address, rn=row_number() over (partition by cname order by cname) 
      from customeraddresses  
    ) x 
    where rn = 1) order by cname
    

    대신 모든 중복을 찾으려면, 단지> 1 RN하는 RN = 1로 변경합니다. 도움이 되었기를 바랍니다

  6. from https://stackoverflow.com/questions/4662464/how-to-select-only-the-first-rows-for-each-unique-value-of-a-column by cc-by-sa and MIT license