[SQL] SQL에 의해 고유의 레코드를 선택하는 방법
SQLSQL에 의해 고유의 레코드를 선택하는 방법
나는 "테이블에서 * 선택"을 수행 할 때 나는 다음과 같은 결과를 얻었다 :
1 item1 data1
2 item1 data2
3 item2 data3
4 item3 data4
당신이 볼 수 있듯이, 2 열에서 DUP 기록 (항목 1은 dupped있다)가있다. 어떻게 난 그냥이 같은 결과를 얻을 수 있습니다 :
1 item1 data1
2 item2 data3
3 item3 data4
하나의 레코드 고유 레코드의 나머지와 함께 중복에서 반환됩니다.
해결법
-
==============================
1.단일 및 다중 열 이름을 가진 별개의 키워드로, 당신은 별개의 기록을 얻을 :
단일 및 다중 열 이름을 가진 별개의 키워드로, 당신은 별개의 기록을 얻을 :
SELECT DISTINCT column 1, column 2, ... FROM table_name;
-
==============================
2.당신은 단지 중복을 제거해야하는 경우 DISTINCT 사용합니다. GROUP BY는 각 그룹에 집계 연산자를 적용하는 데 사용되어야한다
당신은 단지 중복을 제거해야하는 경우 DISTINCT 사용합니다. GROUP BY는 각 그룹에 집계 연산자를 적용하는 데 사용되어야한다
GROUP BY는 DISTINCT v에
-
==============================
3.그것은 당신이 각각의 고유 한 항목에 대한 반환 할 rown에 따라 달라집니다. 귀하의 데이터는 SQL Server에 대한이 경우에 따라서 최소의 데이터 값을 나타낼 것으로 보인다.
그것은 당신이 각각의 고유 한 항목에 대한 반환 할 rown에 따라 달라집니다. 귀하의 데이터는 SQL Server에 대한이 경우에 따라서 최소의 데이터 값을 나타낼 것으로 보인다.
SELECT item, min(data) FROM table GROUP BY item
-
==============================
4.단지 그룹 여러 열 작동하지 않습니다에 의해 어느 집계 함수에 포함되지 말하던 때문에 내부 조인 사용합니다.
단지 그룹 여러 열 작동하지 않습니다에 의해 어느 집계 함수에 포함되지 말하던 때문에 내부 조인 사용합니다.
SELECT a.* FROM yourtable a INNER JOIN (SELECT yourcolumn, MIN(id) as id FROM yourtable GROUP BY yourcolumn ) AS b ON a.yourcolumn= b.yourcolumn AND a.id = b.id;
-
==============================
5.당신이 사용할 수있는 4 가지 방법이 있습니다 :
당신이 사용할 수있는 4 가지 방법이 있습니다 :
테스트 데이터와 다음 샘플 표를 고려 :
/** Create test table */ CREATE TEMPORARY TABLE dupes(word text, num int, id int); /** Add test data with duplicates */ INSERT INTO dupes(word, num, id) VALUES ('aaa', 100, 1) ,('bbb', 200, 2) ,('ccc', 300, 3) ,('bbb', 400, 4) ,('bbb', 200, 5) -- duplicate ,('ccc', 300, 6) -- duplicate ,('ddd', 400, 7) ,('bbb', 400, 8) -- duplicate ,('aaa', 100, 9) -- duplicate ,('ccc', 300, 10); -- duplicate
이것은 가장 간단하고 정직하고, 또한 가장 제한적인 방법입니다 :
SELECT DISTINCT word, num FROM dupes ORDER BY word, num; /* word|num| ----|---| aaa |100| bbb |200| bbb |400| ccc |300| ddd |400| */
그룹화하면, 최소 (ID), 최대 (ID)와 같은 집계 데이터를 추가 계산 할 수 있습니다 (*) 등 :
SELECT word, num, min(id), max(id), count(*) FROM dupes GROUP BY word, num ORDER BY word, num; /* word|num|min|max|count| ----|---|---|---|-----| aaa |100| 1| 9| 2| bbb |200| 2| 5| 2| bbb |400| 4| 8| 2| ccc |300| 3| 10| 3| ddd |400| 7| 7| 1| */
하위 쿼리를 사용하여, 먼저 무시하도록 중복 행을 식별 할 수있는 다음 NOT IN (하위 쿼리) 구조와 외부 쿼리에서 그들을 필터링 :
/** Find the higher id values of duplicates, distinct only added for clarity */ SELECT distinct d2.id FROM dupes d1 INNER JOIN dupes d2 ON d2.word=d1.word AND d2.num=d1.num WHERE d2.id > d1.id /* id| --| 5| 6| 8| 9| 10| */ /** Use the previous query in a subquery to exclude the dupliates with higher id values */ SELECT * FROM dupes WHERE id NOT IN ( SELECT d2.id FROM dupes d1 INNER JOIN dupes d2 ON d2.word=d1.word AND d2.num=d1.num WHERE d2.id > d1.id ) ORDER BY word, num; /* word|num|id| ----|---|--| aaa |100| 1| bbb |200| 2| bbb |400| 4| ccc |300| 3| ddd |400| 7| */
공통 테이블 식 (CTE)에서 원하는 위해 그룹 열로 분할하고 주문 ROW_NUMBER ()를 선택한다. 그런 다음 ROW_NUMBER을 (1) =에만 레코드를 선택 :
WITH CTE AS ( SELECT * ,row_number() OVER(PARTITION BY word, num ORDER BY id) AS row_num FROM dupes ) SELECT word, num, id FROM cte WHERE row_num = 1 ORDER BY word, num; /* word|num|id| ----|---|--| aaa |100| 1| bbb |200| 2| bbb |400| 4| ccc |300| 3| ddd |400| 7| */
-
==============================
6.나는 어떤 이유로 DISTINCT 사용할 수없는 경우, 다음 GROUP BY가 작동합니다 찾을 수 있습니다.
나는 어떤 이유로 DISTINCT 사용할 수없는 경우, 다음 GROUP BY가 작동합니다 찾을 수 있습니다.
-
==============================
7.당신의 결과에 모든 열을 얻으려면 당신은 같은 장소 뭔가가 필요합니다
당신의 결과에 모든 열을 얻으려면 당신은 같은 장소 뭔가가 필요합니다
SELECT distinct a, Table.* FROM Table
그것은 첫 번째 열로 배치됩니다 나머지는 모두 당신의 정의와 같은 순서로 열이 될 것입니다. 이것은 열 a는 반복 될 것입니다.
-
==============================
8.선택 Eff_st ...에서 ( EFF_ST, ROW_NUMBER () 이상 (eff_st BY 파티션)을 선택 XYZ - ABC.CODE_DIM에서
선택 Eff_st ...에서 ( EFF_ST, ROW_NUMBER () 이상 (eff_st BY 파티션)을 선택 XYZ - ABC.CODE_DIM에서
) 여기서 XYZ = 1 EFF_ST 의해 주문 제 5 행만을 가져
from https://stackoverflow.com/questions/1641718/how-to-select-unique-records-by-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 외래 키 테이블 열은 NULL이 될 수 있습니까? (0) | 2020.03.30 |
---|---|
[SQL] SQL 서버 체크 대소 문자 구분? (0) | 2020.03.30 |
[SQL] SQL Server 2008의 "WHERE"절에서 "CASE"문 (0) | 2020.03.30 |
[SQL] 어떻게 GROUP BY 작동합니까? (0) | 2020.03.30 |
[SQL] 내부의 성능은 가입 교차 비교 조인 (0) | 2020.03.30 |