arrow_back

데이터 조인 문제 해결

로그인 가입
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

데이터 조인 문제 해결

Lab 1시간 universal_currency_alt 크레딧 5개 show_chart 중급
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

GSP412

Google Cloud 사용자 주도형 실습

개요

BigQuery는 Google의 완전 관리형, 노옵스(NoOps), 저비용 분석 데이터베이스입니다. BigQuery를 사용하면 관리할 인프라나 데이터베이스 관리자가 없어도 테라바이트 단위의 대규모 데이터를 쿼리할 수 있습니다. BigQuery는 SQL을 사용하므로 사용한 만큼만 지불하는 모델의 장점을 활용할 수 있습니다. BigQuery는 데이터를 분석하여 의미 있고 유용한 정보를 찾는 데 집중할 수 있게 해줍니다.

데이터 테이블 조인은 데이터 세트에 대한 유의미한 인사이트를 제공할 수 있습니다. 하지만 데이터 조인 시 흔히 발생하는 문제로 인해 결과가 손상되기도 합니다. 이 실습에서는 이러한 문제를 방지하는 방법을 주로 살펴봅니다. 조인 유형:

  • 교차 조인: 첫 번째 데이터 세트의 각 행을 두 번째 데이터 세트의 각 행과 조합하여 모든 조합이 출력됩니다.
  • 내부 조인: 결과 테이블에 레코드가 표시되려면 두 테이블 모두에 키 값이 존재해야 합니다. 두 테이블 모두에 일치하는 키 값이 있는 경우에만 병합 결과에 레코드가 표시됩니다.
  • 왼쪽 조인: 오른쪽 테이블에 일치 항목이 있는지와 관계없이 왼쪽 테이블의 각 행이 결과에 표시됩니다.
  • 오른쪽 조인: 왼쪽 조인의 반대입니다. 왼쪽 테이블에 일치 항목이 있는지와 관계없이 오른쪽 테이블의 각 행이 결과에 표시됩니다.

조인에 대한 자세한 내용은 조인 페이지를 참조하세요.

이 실습에서 사용할 데이터는 Google Merchandise Store에 대한 Google 애널리틱스 레코드 수백만 개가 BigQuery에 로드된 전자상거래 데이터 세트입니다. 이 실습에서는 해당 데이터 세트의 사본에서 사용 가능한 필드와 행을 탐색하여 유용한 정보를 파악합니다.

쿼리를 따라 하고 업데이트하는 데 도움이 되는 문법 정보는 표준 SQL 쿼리 문법을 참조하세요.

실습할 내용

이 실습에서는 다음을 수행하는 방법에 대해 알아봅니다.

  • BigQuery를 사용하여 데이터 세트에서 중복 행을 탐색하고 문제를 해결합니다.
  • 데이터 테이블 간에 조인을 만듭니다.
  • 다양한 조인 유형 중에서 선택합니다.

설정 및 요건

실습 시작 버튼을 클릭하기 전에

다음 안내를 확인하세요. 실습에는 시간 제한이 있으며 일시중지할 수 없습니다. 실습 시작을 클릭하면 타이머가 시작됩니다. 이 타이머에는 Google Cloud 리소스를 사용할 수 있는 시간이 얼마나 남았는지 표시됩니다.

실무형 실습을 통해 시뮬레이션이나 데모 환경이 아닌 실제 클라우드 환경에서 직접 실습 활동을 진행할 수 있습니다. 실습 시간 동안 Google Cloud에 로그인하고 액세스하는 데 사용할 수 있는 새로운 임시 사용자 인증 정보가 제공됩니다.

이 실습을 완료하려면 다음을 준비해야 합니다.

  • 표준 인터넷 브라우저 액세스 권한(Chrome 브라우저 권장)
참고: 이 실습을 실행하려면 시크릿 모드 또는 시크릿 브라우저 창을 사용하세요. 개인 계정과 학생 계정 간의 충돌로 개인 계정에 추가 요금이 발생하는 일을 방지해 줍니다.
  • 실습을 완료하기에 충분한 시간---실습을 시작하고 나면 일시중지할 수 없습니다.
참고: 계정에 추가 요금이 발생하지 않도록 하려면 개인용 Google Cloud 계정이나 프로젝트가 이미 있어도 이 실습에서는 사용하지 마세요.

실습을 시작하고 Google Cloud 콘솔에 로그인하는 방법

  1. 실습 시작 버튼을 클릭합니다. 실습 비용을 결제해야 하는 경우 결제 수단을 선택할 수 있는 팝업이 열립니다. 왼쪽에는 다음과 같은 항목이 포함된 실습 세부정보 패널이 있습니다.

    • Google 콘솔 열기 버튼
    • 남은 시간
    • 이 실습에 사용해야 하는 임시 사용자 인증 정보
    • 필요한 경우 실습 진행을 위한 기타 정보
  2. Google 콘솔 열기를 클릭합니다. 실습에서 리소스가 가동된 후 로그인 페이지가 표시된 다른 탭이 열립니다.

    팁: 두 개의 탭을 각각 별도의 창으로 나란히 정렬하세요.

    참고: 계정 선택 대화상자가 표시되면 다른 계정 사용을 클릭합니다.
  3. 필요한 경우 실습 세부정보 패널에서 사용자 이름을 복사하여 로그인 대화상자에 붙여넣습니다. 다음을 클릭합니다.

  4. 실습 세부정보 패널에서 비밀번호를 복사하여 시작 대화상자에 붙여넣습니다. 다음을 클릭합니다.

    중요: 왼쪽 패널에 표시된 사용자 인증 정보를 사용해야 합니다. Google Cloud Skills Boost 사용자 인증 정보를 사용하지 마세요. 참고: 이 실습에 자신의 Google Cloud 계정을 사용하면 추가 요금이 발생할 수 있습니다.
  5. 이후에 표시되는 페이지를 클릭하여 넘깁니다.

    • 이용약관에 동의합니다.
    • 임시 계정이므로 복구 옵션이나 2단계 인증을 추가하지 않습니다.
    • 무료 평가판을 신청하지 않습니다.

잠시 후 Cloud 콘솔이 이 탭에서 열립니다.

참고: 왼쪽 상단에 있는 탐색 메뉴를 클릭하면 Google Cloud 제품 및 서비스 목록이 있는 메뉴를 볼 수 있습니다. 탐색 메뉴 아이콘

BigQuery 콘솔 열기

  1. Google Cloud 콘솔에서 탐색 메뉴 > BigQuery를 선택합니다.

Cloud 콘솔의 BigQuery에 오신 것을 환영합니다라는 메시지 상자가 열립니다. 이 메시지 상자에서는 빠른 시작 가이드 및 출시 노트로 연결되는 링크가 제공됩니다.

  1. 완료를 클릭합니다.

BigQuery 콘솔이 열립니다.

작업 1. 테이블을 저장할 새 데이터 세트 만들기

BigQuery 프로젝트에서 제목이 ecommerce인 새 데이터 세트를 만듭니다.

  1. 프로젝트 ID 옆에 있는 점 3개를 클릭하고 데이터 세트 만들기를 선택합니다.

강조 표시된 데이터 세트 만들기 옵션

데이터 세트 만들기 대화상자가 열립니다.

  1. 데이터 세트 IDecommerce로 설정합니다.

  2. 다른 옵션은 기본값으로 두고 데이터 세트 만들기를 클릭합니다.

왼쪽 창의 프로젝트 아래에 ecommerce 테이블이 표시됩니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.

새 데이터 세트 만들기

작업 2. BigQuery에서 실습 프로젝트 고정

시나리오: 팀에서 여러분에게 전자상거래 웹사이트에서 판매할 각 제품의 인벤토리 재고 수준에 대한 새로운 데이터 세트를 제공합니다. 웹사이트의 제품과 다른 데이터 세트에 조인하는 데 사용할 수 있는 필드에 대해 자세히 알아봐야 합니다.

새 데이터 세트가 포함된 프로젝트는 data-to-insights입니다.

  1. 탐색 메뉴 탐색 메뉴 아이콘 > BigQuery를 클릭합니다.

'Cloud 콘솔의 BigQuery에 오신 것을 환영합니다.'라는 메시지 상자가 열립니다.

참고: 'Cloud 콘솔의 BigQuery에 오신 것을 환영합니다.' 메시지 상자에서는 빠른 시작 가이드 및 UI 업데이트 링크를 확인할 수 있습니다.
  1. 완료를 클릭합니다.

  2. BigQuery 공개 데이터 세트가 기본으로 표시되지는 않습니다. 공개 데이터 세트 프로젝트를 열려면 data-to-insights를 복사합니다.

  3. + 추가 > 이름으로 프로젝트에 별표표시를 클릭한 후 data-to-insights 이름을 붙여넣습니다.

  4. 별표를 클릭합니다.

data-to-insights 프로젝트가 탐색기 섹션에 표시됩니다.

작업 3. 필드 조사

이제 데이터 세트 분석 쿼리를 만드는 데 사용할 수 있는 웹사이트 내 제품과 필드를 살펴봅니다.

  1. '리소스' 섹션의 왼쪽 창에서 data-to-insights > ecommerce > all_sessions_raw로 이동합니다.

  2. 오른쪽 쿼리 편집기 아래에서 스키마 탭을 클릭하여 필드 및 각 필드의 정보를 확인합니다.

작업 4. 전자상거래 데이터 세트의 키 필드 식별

제품과 필드를 더 자세히 조사합니다. 웹사이트의 제품과 다른 데이터 세트에 조인하는 데 사용할 수 있는 필드에 대해 자세히 알아봐야 합니다.

레코드 조사

이 섹션에서는 웹사이트에 있는 제품 이름 수와 제품 SKU 수를 확인하고 각 필드가 고유한지 살펴봅니다.

  1. 웹사이트에 있는 제품 이름 수와 제품 SKU 수를 확인합니다. BigQuery 편집기에 아래 쿼리를 복사하여 붙여넣기합니다.
#standardSQL # how many products are on the website? SELECT DISTINCT productSKU, v2ProductName FROM `data-to-insights.ecommerce.all_sessions_raw`
  1. 실행을 클릭합니다.

콘솔의 페이지로 나누기 결과에서 반환된 총 레코드 수를 확인합니다.

페이지로 나누기에서 확인되는 쿼리 결과 강조 표시

하지만 이러한 결과가 순 제품 SKU 수를 의미할까요? 데이터 분석가로서 실행하는 첫 번째 쿼리 중 하나는 데이터 값의 고유성을 확인하는 것입니다.

  1. 이전 쿼리를 지우고 DISTINCT를 사용하는 아래 쿼리를 실행해서 순 SKU 수를 나열합니다.
#standardSQL # find the count of unique SKUs SELECT DISTINCT productSKU FROM `data-to-insights.ecommerce.all_sessions_raw`

SKU와 이름 사이의 관계 조사

이제 어떤 제품에 SKU가 둘 이상 포함되고 어떤 SKU에 제품 이름이 둘 이상 포함되는지 확인합니다.

  1. 이전 쿼리를 지우고 아래 쿼리를 실행해서 SKU가 둘 이상 포함되는 제품 이름이 있는지 확인합니다. STRING_AGG() 함수를 사용해서 하나의 제품 이름과 연결된 모든 제품 SKU를 쉼표로 구분된 값으로 집계합니다.
SELECT v2ProductName, COUNT(DISTINCT productSKU) AS SKU_count, STRING_AGG(DISTINCT productSKU LIMIT 5) AS SKU FROM `data-to-insights.ecommerce.all_sessions_raw` WHERE productSKU IS NOT NULL GROUP BY v2ProductName HAVING SKU_count > 1 ORDER BY SKU_count DESC
  1. 실행을 클릭합니다.

결과:

쿼리 결과

전자상거래 웹사이트 카탈로그는 각 제품 이름에 개별 SKU로 판매되는 여러 옵션(크기, 색상)이 포함될 수 있음을 보여줍니다.

따라서 한 개의 제품에 12개의 SKU가 포함된 것을 확인했습니다. 한 개의 SKU는 어떨까요? 한 개의 SKU에 둘 이상의 제품이 포함될 수 있을까요?

  • 이전 쿼리를 지우고 아래 쿼리를 실행하여 확인해 봅니다.
SELECT productSKU, COUNT(DISTINCT v2ProductName) AS product_count, STRING_AGG(DISTINCT v2ProductName LIMIT 5) AS product_name FROM `data-to-insights.ecommerce.all_sessions_raw` WHERE v2ProductName IS NOT NULL GROUP BY productSKU HAVING product_count > 1 ORDER BY product_count DESC

쿼리 결과

참고: 대신 STRING_AGG()를 ARRAY_AGG()로 바꿔보세요. 결과가 흥미롭지 않나요? BigQuery는 기본적으로 중첩된 배열 값을 지원합니다. 자세한 내용은 배열 작업 가이드를 참조하세요.

이러한 다대다 데이터 관계가 문제가 되는 이유를 다음 섹션에서 살펴봅니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.

전자상거래 데이터 세트의 키 필드 식별

태스크 5. 문제: 고유하지 않은 키

인벤토리 추적에서 하나의 SKU는 단일 제품을 고유하게 식별하도록 설계되었습니다. 이 개념은 다른 테이블의 정보를 조회할 때 JOIN 조건의 기초로 사용됩니다. 고유하지 않은 키가 있으면 다음과 같이 심각한 데이터 문제가 발생할 수 있습니다.

  1. SKU 'GGOEGPJC019099'에 대해 모든 제품 이름을 식별하도록 쿼리를 작성합니다.

예시 답안:

SELECT DISTINCT v2ProductName, productSKU FROM `data-to-insights.ecommerce.all_sessions_raw` WHERE productSKU = 'GGOEGPJC019099'
  1. 실행을 클릭합니다.

v2ProductName

productSKU

7" Dog Frisbee

GGOEGPJC019099

7" Dog Frisbee

GGOEGPJC019099

Google 7-inch Dog Flying Disc Blue

GGOEGPJC019099

쿼리 결과를 보면 동일한 제품에 대해 3가지 서로 다른 이름이 있는 것을 볼 수 있습니다. 이 예시에서 이름 하나에는 특수문자가 사용되었고 서로 이름이 조금씩 다릅니다.

제품 인벤토리 목록에 따라 웹사이트 데이터 조인

이제 단일 SKU에 여러 제품이 포함된 데이터 세트에서 조인을 수행하면 어떻게 되는지 살펴보겠습니다. 먼저 제품 인벤토리 데이터 세트(products 테이블)에서 이 SKU가 고유한지 확인합니다.

  • 이전 쿼리를 지우고 아래 쿼리를 실행합니다.
SELECT SKU, name, stockLevel FROM `data-to-insights.ecommerce.products` WHERE SKU = 'GGOEGPJC019099'

조인 문제: 의도치 않은 다대일 SKU 관계

이제 2개의 데이터 세트가 있습니다. 하나는 인벤토리 재고 수준에 관한 데이터 세트이고 다른 하나는 웹사이트 분석을 위한 데이터 세트입니다. 인벤토리 재고 수준을 웹사이트에서 판매할 각 제품과 연결할 수 있도록 인벤토리 데이터 세트에 웹사이트 제품 이름 및 SKU와의 JOIN을 수행합니다.

  1. 이전 쿼리를 지우고 아래 쿼리를 실행합니다.
SELECT DISTINCT website.v2ProductName, website.productSKU, inventory.stockLevel FROM `data-to-insights.ecommerce.all_sessions_raw` AS website JOIN `data-to-insights.ecommerce.products` AS inventory ON website.productSKU = inventory.SKU WHERE productSKU = 'GGOEGPJC019099'

이제 이전 쿼리를 확장해서 제품별로 사용 가능한 인벤토리를 단순 합산합니다.

  1. 이전 쿼리를 지우고 아래 쿼리를 실행합니다.
WITH inventory_per_sku AS ( SELECT DISTINCT website.v2ProductName, website.productSKU, inventory.stockLevel FROM `data-to-insights.ecommerce.all_sessions_raw` AS website JOIN `data-to-insights.ecommerce.products` AS inventory ON website.productSKU = inventory.SKU WHERE productSKU = 'GGOEGPJC019099' ) SELECT productSKU, SUM(stockLevel) AS total_inventory FROM inventory_per_sku GROUP BY productSKU

안타깝게도 154 x 3 = 462가 되어 인벤토리 수가 3배로 늘어나는 잘못된 결과가 발생했습니다. 이를 의도치 않은 교차 조인이라고 부릅니다(이후에 자세히 설명).

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.

문제: 고유하지 않은 키

작업 6. 조인 문제 해결책: 조인 전 고유 SKU 사용

개수가 3배로 늘어나는 문제를 해결하기 위한 방법은 무엇일까요? 우선, 다른 데이터 세트에 조인하기 전 웹사이트에서 고유한 SKU를 선택해야 합니다.

'7" Dog Frisbee'와 같이 단일 SKU를 공유하는 제품 이름이 여러 개 있을 수 있습니다.

  1. 모든 가능한 이름을 하나의 배열로 수집합니다.
SELECT productSKU, ARRAY_AGG(DISTINCT v2ProductName) AS push_all_names_into_array FROM `data-to-insights.ecommerce.all_sessions_raw` WHERE productSKU = 'GGOEGAAX0098' GROUP BY productSKU

이제 각 제품 이름에 행을 하나씩 지정하는 대신 각각의 고유한 SKU에만 행을 하나씩 지정합니다.

  1. 중복된 제품 이름을 삭제하기 위해서 다음과 같이 배열에 LIMIT을 적용할 수도 있습니다.
SELECT productSKU, ARRAY_AGG(DISTINCT v2ProductName LIMIT 1) AS push_all_names_into_array FROM `data-to-insights.ecommerce.all_sessions_raw` WHERE productSKU = 'GGOEGAAX0098' GROUP BY productSKU

조인 문제: 조인 후 데이터 레코드 손실

이제 제품 인벤토리 데이터 세트에 다시 조인을 수행할 수 있습니다.

  1. 이전 쿼리를 지우고 아래 쿼리를 실행합니다.
#standardSQL SELECT DISTINCT website.productSKU FROM `data-to-insights.ecommerce.all_sessions_raw` AS website JOIN `data-to-insights.ecommerce.products` AS inventory ON website.productSKU = inventory.SKU

데이터 세트를 조인한 후 819개의 SKU가 사라진 것으로 보입니다. 필드를 더 구체적으로 지정하여(각 데이터 세트의 SKU 열 하나) 조사합니다.

  1. 이전 쿼리를 지우고 아래 쿼리를 실행합니다.
#standardSQL # pull ID fields from both tables SELECT DISTINCT website.productSKU AS website_SKU, inventory.SKU AS inventory_SKU FROM `data-to-insights.ecommerce.all_sessions_raw` AS website JOIN `data-to-insights.ecommerce.products` AS inventory ON website.productSKU = inventory.SKU # IDs are present in both tables, how can you dig deeper?

1,090개의 레코드를 조인한 후 이러한 데이터 세트 모두에 SKU가 반영된 것으로 보입니다. 누락된 레코드는 어떻게 찾을 수 있을까요?

조인 문제 해결책: 올바른 조인 유형을 선택하고 NULL 필터링

기본 JOIN 유형은 조인되는 왼쪽 및 오른쪽 테이블 모두에서 SKU가 일치할 때만 레코드를 반환하는 INNER JOIN입니다.

  1. 다른 조인 유형을 사용하도록 이전 쿼리를 재작성하여 제품 인벤토리 SKU 레코드에 일치 항목이 있는지와 관계없이 website 테이블의 모든 레코드를 포함하도록 합니다. 조인 유형에는 INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN이 있습니다.

예시 답안:

#standardSQL # the secret is in the JOIN type # pull ID fields from both tables SELECT DISTINCT website.productSKU AS website_SKU, inventory.SKU AS inventory_SKU FROM `data-to-insights.ecommerce.all_sessions_raw` AS website LEFT JOIN `data-to-insights.ecommerce.products` AS inventory ON website.productSKU = inventory.SKU
  1. 실행을 클릭합니다.

LEFT JOIN을 사용해서 원래 1,909개의 웹사이트 SKU가 모두 결과에 반환되도록 했습니다.

제품 인벤토리 집합에서 누락된 SKU는 몇 개인가요?

  1. inventory 테이블에서 NULL 값을 필터링하도록 쿼리를 작성합니다.

예시 답안:

#standardSQL # find product SKUs in website table but not in product inventory table SELECT DISTINCT website.productSKU AS website_SKU, inventory.SKU AS inventory_SKU FROM `data-to-insights.ecommerce.all_sessions_raw` AS website LEFT JOIN `data-to-insights.ecommerce.products` AS inventory ON website.productSKU = inventory.SKU WHERE inventory.SKU IS NULL
  1. 실행을 클릭합니다.

질문: 누락된 제품은 몇 개인가요?

답변: 제품 인벤토리 데이터 세트에서 819개의 제품이 누락되었습니다(SKU가 NULL인 제품).

  • 이전 쿼리를 지우고 아래 쿼리를 실행하여 웹사이트 데이터 세트에 사용되는 SKU가 고유한지 확인합니다.
#standardSQL # you can even pick one and confirm SELECT * FROM `data-to-insights.ecommerce.products` WHERE SKU = 'GGOEGATJ060517' # query returns zero results

반대의 상황은 어떨까요? 제품 인벤토리 데이터 세트에 있지만 웹사이트에서 누락된 제품이 있을까요?

  1. 조사를 위해 다른 조인 유형을 사용하는 쿼리를 작성합니다.

예시 답안:

#standardSQL # reverse the join # find records in website but not in inventory SELECT DISTINCT website.productSKU AS website_SKU, inventory.SKU AS inventory_SKU FROM `data-to-insights.ecommerce.all_sessions_raw` AS website RIGHT JOIN `data-to-insights.ecommerce.products` AS inventory ON website.productSKU = inventory.SKU WHERE website.productSKU IS NULL
  1. 실행을 클릭합니다.

답변: 예. 웹사이트 데이터 세트에서 2개의 제품 SKU가 누락되었습니다.

이제 제품 인벤토리 데이터 세트의 필드를 추가하여 더 자세히 분석해 봅니다.

  • 이전 쿼리를 지우고 아래 쿼리를 실행합니다.
#standardSQL # what are these products? # add more fields in the SELECT STATEMENT SELECT DISTINCT website.productSKU AS website_SKU, inventory.* FROM `data-to-insights.ecommerce.all_sessions_raw` AS website RIGHT JOIN `data-to-insights.ecommerce.products` AS inventory ON website.productSKU = inventory.SKU WHERE website.productSKU IS NULL

아래 제품이 전자상거래 웹사이트 데이터 세트에서 누락되는 이유는 무엇일까요?

website_SKU

SKU

name

orderedQuantity

stockLevel

restockingLeadTime

sentimentScore

sentimentMagnitude

null

GGOBJGOWUSG69402

USB wired soundbar - in store only

10

15

2

1.0

1.0

null

GGADFBSBKS42347

PC gaming speakers

0

100

1

null

null

예시 답변:

  • 새 제품 하나(주문이 없고 sentimentScore가 없음) 및 'in store only' 상태인 제품 하나
  • 주문이 0인 또 다른 새 제품 하나

새 제품이 웹사이트 데이터 세트에 표시되지 않는 이유는 무엇일까요?

  • 웹사이트 데이터 세트는 고객의 이전 주문 거래 내역입니다. 한 번도 판매된 적이 없는 새로운 제품은 고객이 조회하거나 구매하기 전까지 웹로그 분석에 표시되지 않습니다.
참고: 일반적으로 프로덕션 쿼리에서는 RIGHT JOIN을 볼 수 없습니다. 대신 LEFT JOIN을 사용하고 테이블 순서를 거꾸로 하면 됩니다.

웹사이트 또는 인벤토리에서 누락된 모든 제품을 하나의 쿼리로 나열하려면 어떻게 해야 할까요?

  1. 다른 조인 유형을 사용해서 쿼리를 작성합니다.

예시 답안:

#standardSQL SELECT DISTINCT website.productSKU AS website_SKU, inventory.SKU AS inventory_SKU FROM `data-to-insights.ecommerce.all_sessions_raw` AS website FULL JOIN `data-to-insights.ecommerce.products` AS inventory ON website.productSKU = inventory.SKU WHERE website.productSKU IS NULL OR inventory.SKU IS NULL
  1. 실행을 클릭합니다.

이제 819 + 2 = 821개의 제품 SKU가 표시됩니다.

LEFT JOIN + RIGHT JOIN = FULL JOIN이며, 이는 일치하는 조인 키와 관계없이 두 테이블의 모든 레코드를 반환합니다. 그런 후 어느 한쪽에서 일치하지 않는 항목을 필터링할 수 있습니다.

조인 문제: 의도치 않은 교차 조인

데이터 테이블 키(1:1, 1:N, N:N) 사이의 관계를 알지 못하면 예기치 않은 결과가 반환될 수 있고 쿼리 성능도 크게 저하될 수 있습니다.

마지막 조인 유형은 CROSS JOIN입니다.

Clearance 카테고리의 제품 전반에 적용하려는 사이트 전체 할인율을 사용해서 새 테이블을 만듭니다.

  1. 이전 쿼리를 지우고 아래 쿼리를 실행합니다.
#standardSQL CREATE OR REPLACE TABLE ecommerce.site_wide_promotion AS SELECT .05 AS discount;

이제 왼쪽 창에서 제품 및 데이터 세트 아래의 '리소스' 섹션에 site_wide_promotion이 나열됩니다.

  1. 이전 쿼리를 지우고 아래 쿼리를 실행하여 Clearance에 있는 제품 수를 확인합니다.
SELECT DISTINCT productSKU, v2ProductCategory, discount FROM `data-to-insights.ecommerce.all_sessions_raw` AS website CROSS JOIN ecommerce.site_wide_promotion WHERE v2ProductCategory LIKE '%Clearance%'

참고: CROSS JOIN에는 조인 조건이 없는 것을 알 수 있습니다(예: ON 또는 USING). 이 필드는 단순히 첫 번째 데이터 세트에 대해 배로 증가하거나 모든 항목에서 0.05 할인율을 사용합니다.

discount 테이블에 의도치 않게 레코드를 둘 이상 추가할 때 어떻게 되는지 확인해 봅니다.

  1. 이전 쿼리를 지우고 아래 쿼리를 실행하여 둘 이상의 레코드를 promotion 테이블에 삽입합니다.
INSERT INTO ecommerce.site_wide_promotion (discount) VALUES (.04), (.03);

이제 promotion 테이블에서 데이터 값을 확인합니다.

  1. 이전 쿼리를 지우고 아래 쿼리를 실행합니다.
SELECT discount FROM ecommerce.site_wide_promotion

반환되는 레코드 수는 몇 개인가요?

답변: 3개

clearance 제품 82개 전체에 할인율을 다시 적용하면 어떻게 될까요?

  1. 이전 쿼리를 지우고 아래 쿼리를 실행합니다.
SELECT DISTINCT productSKU, v2ProductCategory, discount FROM `data-to-insights.ecommerce.all_sessions_raw` AS website CROSS JOIN ecommerce.site_wide_promotion WHERE v2ProductCategory LIKE '%Clearance%'

몇 개의 제품이 반환되나요?

답변: 82개가 아닌, 시작할 때 원래 테이블보다 많은 246개의 레코드가 반환되었습니다.

이제 제품 SKU를 조사해서 근본적인 원인을 파악합니다.

  1. 이전 쿼리를 지우고 아래 쿼리를 실행합니다.
#standardSQL SELECT DISTINCT productSKU, v2ProductCategory, discount FROM `data-to-insights.ecommerce.all_sessions_raw` AS website CROSS JOIN ecommerce.site_wide_promotion WHERE v2ProductCategory LIKE '%Clearance%' AND productSKU = 'GGOEGOLC013299'

CROSS JOIN은 어떤 영향을 미쳤나요?

답변: 교차 조인을 수행할 할인 코드가 3개 있으므로 원래 데이터 세트에 3이 곱해집니다.

참고: 이 문제는 교차 조인만의 문제가 아닙니다. 일반적인 조인에서도 데이터 관계가 다대다일 경우 실수로 교차 조인을 수행할 수 있습니다. 이로 인해 수백만 또는 수십억 개의 레코드가 의도치 않게 반환될 수 있습니다.

해결책은 조인 전에 데이터 관계를 파악하고 키가 고유하다고 가정하지 않는 것입니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.

조인 문제 해결책

수고하셨습니다

지금까지 실습을 통해 중복 레코드를 식별하고 각 조인 유형을 사용해야 하는 경우를 파악하여 심각한 SQL 조인 문제를 해결하는 방법을 살펴봤습니다. 훌륭합니다.

다음 단계/더 학습하기

Google Cloud 교육 및 자격증

Google Cloud 기술을 최대한 활용하는 데 도움이 됩니다. Google 강의에는 빠른 습득과 지속적인 학습을 지원하는 기술적인 지식과 권장사항이 포함되어 있습니다. 기초에서 고급까지 수준별 학습을 제공하며 바쁜 일정에 알맞은 주문형, 실시간, 가상 옵션이 포함되어 있습니다. 인증은 Google Cloud 기술에 대한 역량과 전문성을 검증하고 입증하는 데 도움이 됩니다.

설명서 최종 업데이트: 2024년 2월 3일

실습 최종 테스트: 2023년 9월 20일

Copyright 2024 Google LLC All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.