본문 바로가기

Computer Science/DB

[DB] postgresDB에서 distinct on에 대해서

 

🟦 "distinct" 키워드를 사용하면 해당 열(들)에 대해 중복을 제거하여 고유한 값을 반환한다는 것입니다. 즉, 중복된 값이 있을 경우 첫 번째로 나오는 값만 반환하는 것이 아니라, 중복을 제거한 후에 고유한 값들을 모두 반환합니다.

 

🟦 "distinct on"은 PostgreSQL의 확장 기능 중 하나로, 지정된 열(들)을 기준으로 중복을 제거하고 해당 열들의 첫 번째 값을 반환합니다. 따라서 "distinct on"을 사용하면 해당 열(들)에 대해서는 중복을 제거하여 첫 번째로 나오는 값만 반환하게 됩니다.

예를 들어, "distinct on (A.storage_id, A.item_id)" 구문이 쿼리에 포함되어 있다면, "A.storage_id"와 "A.item_id" 열의 조합에 대해서 중복을 제거하고 첫 번째로 나오는 레코드만 반환하게 됩니다. 다른 열들은 중복 여부와 관계없이 모두 반환됩니다.

따라서 "distinct"와 "distinct on"은 약간 다른 기능을 가지고 있으며, "distinct on"은 특정 열들에 대해서만 중복을 제거하여 반환하는 기능입니다.

 

예시를 들어보겠습니다.

물품 판매 기록을 담고 있는 sales 테이블이 있다고 가정해봅시다. 해당 테이블은 다음과 같은 열을 가지고 있습니다:

  • sale_id: 판매 ID
  • product_id: 제품 ID
  • customer_id: 고객 ID
  • sale_date: 판매 날짜

테이블의 데이터는 다음과 같습니다:

 

sale_id product_id customer_id sale_date
1 A 101 2022-01-01
2 B 102 2022-01-01
3 A 103 2022-01-02
4 C 101 2022-01-02
5 B 101 2022-01-03

이제, 다음 두 가지 쿼리를 비교해보겠습니다.

 

🟦 SELECT DISTINCT product_id FROM sales;

위의 쿼리는 sales 테이블에서 중복을 제거한 고유한 product_id 값을 반환합니다. 결과는 다음과 같습니다:

product_id
A
B
C



🟦 SELECT DISTINCT ON (customer_id) * FROM sales ORDER BY customer_id, sale_date DESC;

위의 쿼리는 sales 테이블에서 **customer_id**를 기준으로 중복을 제거하고, 각 **customer_id**별로 가장 최근의 판매 레코드를 반환합니다. 결과는 다음과 같습니다:

sale_id product_id customer_id sale_date

3 A 103 2022-01-02
4 C 101 2022-01-02
2 B 102 2022-01-01

위의 결과에서는 **customer_id**를 기준으로 중복을 제거하고, 각 **customer_id**별로 가장 최근의 판매 레코드를 선택합니다. 따라서 **customer_id**가 101인 경우에는 가장 최근의 두 개의 판매 레코드가 있지만, **customer_id**가 101인 경우에는 가장 최근의 하나의 판매 레코드만 선택됩니다.

즉, "DISTINCT"는 지정된 열(들)에 대해서 중복을 제거하여 고유한 값을 반환하며, "DISTINCT ON"은 지정된 열(들)에 대해서 중복을 제거하고, 그룹화된 결과에서 첫 번째 레코드만 반환합니다.

728x90