열의 각 고유 값에 대해 첫 번째 행만 선택하는 방법은 무엇입니까?
예를 들어, 고객 주소 표가 있다고 가정해 보겠습니다.
+-----------------------+------------------------+
| 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
'prosource' 카테고리의 다른 글
코드백에서 최소화된 창을 복원하는 방법은 무엇입니까? (0) | 2023.04.28 |
---|---|
rvm use 2.0.0 --default를 수행할 때 "경고! PATH가 제대로 설정되지 않았습니다"가 표시됨 (0) | 2023.04.28 |
Python을 통해 Excel 매크로를 실행하시겠습니까? (0) | 2023.04.28 |
Git에서 현재 커밋에 대한 해시를 얻으려면 어떻게 해야 합니까? (0) | 2023.04.28 |
성능 측면:WPF 애플리케이션이 전자 애플리케이션보다 현명하게 코딩되는 것이 더 낫습니까? (0) | 2023.04.28 |