prosource

열의 각 고유 값에 대해 첫 번째 행만 선택하는 방법은 무엇입니까?

probook 2023. 4. 28. 21:07
반응형

열의 각 고유 값에 대해 첫 번째 행만 선택하는 방법은 무엇입니까?

예를 들어, 고객 주소 표가 있다고 가정해 보겠습니다.

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

이 표에서는 John Smith와 같은 한 고객이 여러 개의 주소를 가질 수 있습니다.나는 그것이 필요합니다.SELECT이 테이블이 'CName'에 중복이 있는 첫 번째 행만 반환하도록 쿼리합니다.이 테이블의 경우 세 번째(또는 첫 번째)를 제외한 모든 행을 반환해야 합니다. 두 개의 주소 중 하나만 반환할 수 있습니다.

추가할 수 있는 키워드가 있습니까?SELECT서버가 이전에 이미 열 값을 보았는지 여부를 기준으로 필터링하기 위한 쿼리?

어떤 주소가 사용되든 상관없다고 하면 아주 간단한 대답입니다.

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

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

사용할 수 있습니다.row_number() over(partition by ...)다음과 같은 구문:

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

이렇게 하면 다음과 같은 열이 생성됩니다.row같은 것을 볼 때마다 증가하는 카운터입니다.CName다음 기준으로 발생한 항목을 인덱싱합니다.AddressLine부과함으로써where row = 1선택할 수 있습니다.CName누구의.AddressLine알파벳 순으로 맨 앞에 옵니다.만약에order by이었다desc그러면 그것은 선택할 것입니다.CName누구의.AddressLine알파벳 순으로 마지막에 옵니다.

사용할 수 있습니다.row_number()행의 행 번호를 가져옵니다.를 사용합니다.over명령 - 더partition by절은 번호 매기기를 다시 시작할 시기를 지정합니다.order by행 번호를 정렬할 대상을 선택합니다.추가한 경우에도order by당신의 질의 끝까지, 그것은 순서를 보존할 것입니다.over명령을 입력합니다.

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

이렇게 하면 각 중복 행의 행이 하나씩 표시됩니다.또한 비트 유형 열을 제공하며 적어도 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

대신 모든 중복 항목을 찾으려면 rn = 1을 > 1로 변경하면 됩니다.이것이 도움이 되길 바랍니다.

select amount 
from (
  select distinct(amount) 
  from orders 
  order by amount desc 
  limit 3
) 
order by amount asc 
limit 1;

고객 테이블에서 모든 고유한 값을 가져오려면 다음을 사용합니다.

SELECT DISTINCT CName FROM customertable;

w3 문서에 대한 자세한 내용: https://www.w3schools.com/sql/sql_distinct.asp

언급URL : https://stackoverflow.com/questions/4662464/how-to-select-only-the-first-rows-for-each-unique-value-of-a-column

반응형