다니엘 발렌테, 박사, JMP SAS 수석 제품 관리자
존 바이스 , SAS의 JMP 영업 및 마케팅 부사장
추상적인
JMP 13은 분석가가 일반적인 데이터 문제를 쉽게 처리할 수 있도록 하는 두 가지 새로운 도구를 도입합니다. 종종 두 개 이상의 데이터 테이블이 공통 키로 연관되지만 팩트 샘플링 빈도나 차원(예: 긴 것과 넓은 것) 측면에서 매우 다릅니다. 이 두 개(또는 그 이상) 테이블을 실제로 조인하면 메모리에서 매우 큰 결과 테이블이 생성될 수 있습니다. 팩트 테이블과 차원 테이블이 비교적 컴팩트한 경우 이는 귀찮은 일이지만 메모리에 맞지 않을 만큼 큰 조인 테이블을 빠르게 생성할 수 있습니다. 해결책은 가상 조인을 사용하여 조인된 테이블을 실제로 생성하지 않고도 조인된 관계를 유지하는 것입니다. 즉, 부담을 주지 않고 팩트 테이블을 효과적으로 풍부하게 합니다. 분석가는 종종 데이터베이스에서 복잡한 테이블 조인이나 요약을 만들고 SQL을 작성해야 하는데, 이는 특히 차원이 느리게 변하는 것과 같은 복잡한 관계가 있는 경우 고유한 일련의 고통을 겪습니다. JMP Query Builder는 쉬운 SQL 생성 및 작성 도구 역할을 하며, 이 도구의 코드는 데이터베이스에서 실행할 수 있습니다. 정확하고 원하는 쿼리를 끌어서 놓으면 쿼리 빌더가 자동으로 SQL 코드를 작성해 주므로 지루하고 오류가 발생하기 쉬운 수동 작업이 필요 없습니다.
관계형 테이블 구조 개요
분석가는 열에 변수가 있고 행에 관찰치가 있는 형태의 데이터가 필요합니다. 데이터에는 관찰치를 명확히 하위 그룹화하는 범주형 열(예: 소득 수준, 국가, 기계 등)이 필요할 수도 있습니다. 데이터에는 관찰치를 더욱 명확히 설명하는 속성(예: 주소, 일련 번호, 고객 ID 등)이 있을 수도 있습니다.
종종 이러한 분석의 소스 데이터는 데이터베이스에 저장된 관계형 데이터 구조입니다. 데이터 과학의 많은 현대적 학업 과정은 관계형 데이터 구조, 데이터베이스 및 SQL과 관련된 주제를 다룹니다. 하지만 대부분의 엔지니어, 과학자 및 통계학자는 학문적 환경에서 이러한 주제에 노출되지 않으므로 지속적이고 비공식적인 교육의 일환으로 이에 대해 배워야 합니다. JMP Query Builder는 분석가에게 관계형 데이터 구조와 분석에 적합한 데이터 간의 교량을 제공합니다. 분석가는 몇 가지 용어와 개념을 배우면 Query Builder를 사용하여 분석에 적합한 데이터를 생성할 수 있습니다.
이 논문에서 관계형 데이터 구조에 대해 간략하게 논의하는 것은 해당 주제에 대한 철저한 연구를 대체하려는 것이 아닙니다. 오히려 JMP에서 쿼리 빌더와 가상 조인 기능을 사용할 때 사용되는 용어와 정의를 소개하는 것입니다.
중요한 데이터를 저장하기 위해 두 개 이상의 테이블을 갖는 이유는 무엇입니까?
고객의 회사 제품 구매에 대한 데이터를 저장하는 방법을 고안해야 한다고 가정해 보겠습니다. 먼저 수집해야 할 수 있는 모든 변수를 나열하는 것으로 시작할 수 있습니다. 예를 들어 다음과 같습니다.
- 구매 날짜
- 구매 금액
- 구매 방법(PO 또는 CC)
- 제품 SKU
- 제품 설명
- 고객 이름
- 고객 주소
- 고객 전화번호
이것은 확실히 포괄적인 목록은 아니지만 좋은 시작입니다. 이제 이 데이터를 유지하는 것에 대해 생각해 보세요. 이 표에는 각 구매에 대해 8개의 열과 1개의 행이 있습니다. 일부 필드에는 구매 금액이나 구매 날짜와 같이 여러 개의 고유한 값이 있을 수 있습니다. 다른 필드에는 훨씬 적은 고유한 값과 제품 SKU 및 설명과 같이 많은 반복 값이 있습니다.
테이블의 크기를 줄이는 일반적인 방법은 테이블을 세 개의 논리적 그룹으로 나누는 것입니다.첫 번째는 구매 날짜 및 구매 금액과 같은 거래 또는 사실을 포함하는 테이블입니다.두 번째 테이블에는 고객 정보가 있고 세 번째 테이블에는 제품 정보가 있습니다.데이터 열 간의 링크를 유지하려면 세 테이블을 연결하는 링크 정보가 있는 열을 추가해야 합니다.이러한 열을 키 라고 합니다.이 레이아웃을 표시하는 일반적인 방법은 엔터티 관계 다이어그램(ER)을 사용하는 것입니다.각 엔터티에는 테이블 이름, 각 행을 고유하게 식별하는 키 또는 키 집합, 각 행에 대한 정보를 제공하는 속성 또는 변수 집합이 있습니다.고객 구매 날짜에 대한 ER 다이어그램은 그림 1에 나와 있습니다.

그림 1. 고객 구매 데이터에 대한 엔티티 관계 다이어그램
고객 차원 테이블에서 고객 ID 옆에 있는 키 기호는 고객 ID를 알고 있다면 테이블에서 해당 고객과 모든 관련 정보를 고유하게 찾을 수 있음을 의미합니다. 고객 ID는 또한 구매 사실 테이블에 있습니다. 고객 ID는 구매 사실 테이블에 있을 때 외래 키라고 하는데, 여러 번 나타날 수 있고 외래 테이블의 행을 나타나는 행과 고유하게 정의하기 때문입니다.
그림 1의 레이아웃을 사용하면 제품 설명을 업데이트하는 방법을 매우 쉽게 알 수 있습니다. 이를 위해 제품 차원 테이블만 편집하면 되고, 그 변경 사항은 지금까지 이루어진 모든 구매에 적용되며, 이를 유지 관리 성이라고 합니다. 제품 설명이 여러 번 반복되는 테이블이 하나라면 여러 행을 편집해야 하며, 이는 필연적으로 실수와 데이터 품질 문제로 이어질 것입니다.
사례 1: 현재 인구 조사
이제 Query Builder를 사용한 예를 살펴보겠습니다. 미국 정부는 Current Population Survey(CPS)[USGCPS]를 통해 많은 흥미로운 데이터를 수집합니다. CPS는 다음과 같습니다.
“현재 인구 조사(CPS)는 미국에서 가장 오래되고 규모가 크며 가장 잘 알려진 조사 중 하나입니다. 개인과 사회를 정의하는 많은 것, 즉 일, 수입, 교육에 대한 정보를 제공하는 매우 중요한 조사입니다. CPS는 월별 노동력 통계의 주요 출처일 뿐만 아니라, 국민의 경제적, 사회적 복지에 대한 정보를 국가에 제공하는 다양한 다른 연구를 위한 데이터를 수집하는 데 사용됩니다. 이는 월별 기본 CPS 질문에 일련의 보충 질문을 추가하여 수행됩니다. 보충 질문은 매달 달라지며 자녀 부양, 자원 봉사, 건강 보험 적용 범위, 학교 등록과 같은 다양한 주제를 다룹니다. 보충은 일반적으로 매년 또는 2년마다 실시되지만 보충의 빈도와 반복은 보충 후원자의 요구 사항을 가장 잘 충족하는 것에 따라 완전히 달라집니다.”
이 데이터는 36개의 텍스트 파일로 다운로드할 수 있으며, 탭으로 구분된 텍스트 파일이기 때문에 JMP에서 쉽게 열 수 있습니다. JMP 테이블을 살펴보면 ER 다이어그램(그림 2)이 생성되어 쿼리 빌더에서 작업을 알려줍니다.

그림 2. CPS 노동력 통계 데이터 표에 대한 ER 다이어그램
쿼리 빌더를 사용하려면 기본 테이블(팩트)과 보조 테이블(차원 )을 정의해야 합니다.
CPS 데이터의 사실 테이블은 다음과 같이 호출됩니다.AllData.jmp. 테이블에는 500만 개가 넘는 행이 있지만 열은 5개뿐입니다. 열에는 "series_id", 날짜 및 "value" 열이 있습니다. 데이터를 이해하려면 데이터가 무엇인지 알아내야 합니다.시리즈_아이디.jmp 수단. 그림 2의 ER 다이어그램은 “series_id”가 다음과 관련되어 있음을 보여줍니다.시리즈.jmp테이블. 다음으로, JMP에서 두 테이블을 열고 Query Builder를 사용하여 조인을 정의합니다.
JMP에서 다음을 선택하세요.AllData.jmp기본(사실) 테이블로서시리즈.jmp2차(차원) 테이블(그림 3)로. JMP는 자동으로 맞는 키를 찾아 조인을 설정하지만, series 테이블 오른쪽에 있는 벤 다이어그램을 클릭하여 확인해야 합니다. 쿼리 빌더는 두 테이블에서 "footnote_codes"를 찾았지만, 키로 조인하지 않고 "series_id"로만 조인하고 싶어서 해당 키 관계를 제거해야 합니다.

그림 3. 조인을 위한 쿼리 빌더AllData.jmp그리고시리즈.jmp
이제 조인된 테이블의 열을 정의해야 합니다(그림 4). 이를 위해 다음을 선택합니다.AllData.jmp왼쪽 상단에서 해당 테이블에서 필요한 열을 선택합니다. 결과 테이블에서 해당 키가 필요하지 않으므로 지금 "series_id"를 삭제합니다(시리즈 및 데이터.jmp).

그림 4. 조인을 위한 쿼리 빌더시리즈 및 데이터.jmp모두에게 “_코드.jmp” 테이블
이것을 주목하세요시리즈 및 데이터.jmp약 5배 더 큽니다AllData.jmp테이블. 이 인플레이션은 모든 "_code" 필드의 반복된 값 때문입니다. 따라서 36개 테이블에 데이터를 저장하면 저장 요구 사항이 상당히 줄어듭니다. 다음으로 다음을 선택합니다.시리즈 및 데이터.jmp 기본 테이블 및 모든“_코드.jmp” 테이블을 보조 테이블로 사용합니다(그림 5).

그림 5. 모든 "을 결합하기 위한 쿼리 빌더_코드.jmp”
더 이상 키 변수가 필요 없기 때문에 "_code" 테이블의 "_text" 필드만으로 쿼리를 빌드합니다. JMP의 Cols > Columns Viewer를 사용하면 테이블의 42개 열에 대한 요약을 쉽게 얻을 수 있습니다.전체 join.jmp.여전히 570만 개의 행이 유지되며 이는 다음과 같습니다.AllData.jmp, 하지만 이제 데이터를 설명하는 텍스트 필드가 있습니다. 테이블이전체 join.jmp여전히 테이블보다 6배 더 큽니다AllData.jmp,이제 분석에 유용한 표가 생겼습니다.
그래프 빌더를 사용하여 제조업 실업 추세를 플로팅합니다.전체 join.jmp. 그림 6에서 경기 침체 중 이 부문의 혼란은 빨간색 추세선으로 표시되어 있습니다. 2016년 실업률은 2006-2007년 수준으로 돌아왔습니다. 녹색 추세선은 자동차 제조 부문의 고용 수준을 보여줍니다. 2010년부터 2015년까지 300,000개 이상의 자동차 제조 일자리가 추가되었습니다.

그림 6. CPS 노동력 통계 데이터를 보여주는 그래프 빌더
사례 2: 레스토랑 검사 데이터
이 사례에서는 가상 조인과 JMP 쿼리 빌더를 사용하여 DOHMH 뉴욕시 레스토랑 검사 결과를 분석하는 방법을 살펴봅니다.[도흐흐]. 새로운 검사관으로서의 자신을 상상해 보세요. 그리고 과거 데이터를 탐색하여 데이터가 무엇을 보여주는지 살펴보세요. 웹사이트에서https://data.cityofnewyork.us/Health/DOHMH-New-York-City-Restaurant-Inspection-Results/xx67-kt59, JMP에서 쉽게 열 수 있는 이 데이터의 .csv 버전을 다운로드할 수 있습니다. 2016년 7월 17일 전체 다운로드는 448,149개 레코드를 포함하는 163.3MB 파일을 생성합니다.
이 데이터에는 검사 날짜 열이 있는데, 이는 검사 이벤트의 M/D/Y입니다. 이 데이터에 몇 년이 포함되어 있는지 확인하려면 마우스 오른쪽 버튼을 클릭하고 새 수식 열 > 날짜 시간 > 연도를 사용합니다. 이를 연속형에서 명목형으로 변환한 다음 분석 > 분포를 선택하면 그림 7에 나와 있습니다. 수준 1900은 누락된 데이터에 대한 코드일 가능성이 높으며, 해결해야 할 사항입니다. 이 데이터를 파괴적으로 편집하는 것은 문제가 되지 않습니다(여기서는 JMP가 샌드박스로 사용되고 실제 데이터는 항상 서버에 저장되기 때문). 그런 다음 Recode 유틸리티를 사용하여 이 수준을 누락으로 변경합니다.

그림 7. 전체 데이터 세트에 대한 검사 날짜
재코딩 창에는 01/01/1900인 1,151개의 레코드가 있습니다. 문자열을 삭제한 다음 완료 -> 제자리에서를 클릭하여 이 이전 값을 •로 변경합니다. RECORD DATE는 데이터를 가져온 날짜이고 이 분석에는 중요하지 않으므로 열을 삭제합니다.
이 논문은 가상 조인과 쿼리 빌더에 관한 것이므로, 왜 비정규화된 테이블을 보는지 궁금할 것입니다. 이러한 데이터를 정규화할 수 있는 기회가 있는 것 같습니다. 이러한 원시 데이터에서 눈에 띄게 빠진 것은 개별 레스토랑의 지오코딩된 위치입니다. 이 작업은 나중에 JMP 추가 기능으로 수행할 수 있습니다. 이 프로세스는 계산적으로 비용이 많이 들기 때문에 이러한 데이터에서 여러 검사가 있을 수 있는 고유한 위치만 지오코딩하는 것이 합리적입니다. 또한 고유한 검사보다 훨씬 적은 위반 사항의 추가 테이블을 가질 수 있는 기회가 있는 것 같습니다.
데이터를 분할하기 전에, 먼저 이 데이터 샘플을 채취하여 탐색 연습을 위해 숫자를 더 쉽게 관리할 수 있도록 하세요.
샘플링은 Query Builder를 사용하면 쉽게 수행할 수 있는 작업입니다. Tables > JMP Query Builder를 클릭하면 시작 대화 상자가 나타납니다. 이 경우 조인을 수행하지 않으므로 다음을 사용합니다.DOHMH_New_York_City_Restaurant_Inspection_Results.jmp이 시점에서 보조 테이블이 없는 기본 테이블로 지정합니다. 쿼리 빌더에는 샘플이라는 탭이 있습니다. "이 결과 집합 샘플링" 확인란을 켜면 첫 번째 N 개 행 또는 임의 N 개 행을 선택할 수 있습니다. 이러한 데이터의 10% 무작위 샘플을 가져와서 임의 N 개 행에 44,815개를 입력합니다. 모든 열을 포함 열 섹션에 추가한 다음 SQL을 검사합니다. 쿼리 빌더는 이 쿼리를 수행하기 위한 SQL을 자동으로 생성했습니다.
SELECT t1.CAMIS, t1.DBA, t1.BORO, t1.BUILDING,
t1.거리, t1.우편번호, t1.전화번호, t1."요리 설명",
t1."검사 날짜", t1."조치", t1."위반 코드", t1."위반 설명",
t1."중요 플래그", t1.점수, t1.등급, t1."등급 날짜",
t1."검사 유형", t1."년도[검사 날짜]"
DOHMH_New_York_City_Restaurant_Inspection_Results에서 티1
RANDOM() 제한으로 정렬 44815;
사용 후무작위로 정렬 () 샘플링을 위한 함수로, 이 쿼리는 적절한 데이터 하위 집합을 생성합니다. 이것을 하위 집합으로 저장한 다음 레스토랑 인구 통계와 위반 코드를 분할합니다. 쿼리 빌더도 여기에서 사용할 수 있습니다. 위반 코드로 시작합니다. 다시 말하지만, 기본 테이블만 있으면 됩니다. VIOLATION CODE와 VIOLATION DESCRIPTION을 변수 목록으로 끌어다 놓은 다음 VIOLATION CODE를 다시 끌어서 카운트별로 집계하고 원하는 속성이 있는 테이블을 생성할 수 있습니다. 집계 열의 JMP 이름을 VIOLATION COUNT로 변경합니다. 열 또는 파생 열에 대한 별칭을 생성하는 이 기능은 쿼리 빌더의 강력한 기능입니다. 그림 8에 표시된 대로 VIOLATION COUNT를 정렬 기준 역할로 끌어서 새로 만든 집계 열을 기준으로 자동 정렬하도록 선택할 수도 있습니다.

그림 8. 위반 횟수로 이름이 변경된 집계 열, 정렬 기준 속성 포함
88개의 고유한 위반 코드만 있으므로 이 결과 쿼리는 훨씬 더 간결합니다. 이 테이블의 이름을 D-위반코드.jmp 로 지정한 후 Graph Builder를 사용하여 가장 많은 레코드가 있는 코드를 탐색하기에 좋은 시점입니다. VIOLATION DESCRIPTION을 X축으로, VIOLATION COUNT를 Y축으로 끌어다 놓습니다. 그런 다음 VIOLATION DESCRIPTION을 마우스 오른쪽 버튼으로 클릭하고 VIOLATION COUNT(내림차순)로 정렬합니다. 상위 범주에만 초점을 맞추려면 위반 범주에 VIOLATION COUNT에 대한 로컬 데이터 필터를 사용할 수 있으며, 해당 범주에는 2,500개 이상의 고유 레코드가 있습니다(그림 9).

그림 9. 상위 위반 횟수(샘플링된 테이블의 고유 레코드 수가 2500개 이상)
지금은 위반 표에서 벗어나 고유한 레스토랑 인구 통계에 집중할 수 있습니다. 이 시점에서 위반 설명을 삭제할 수도 있는데, 그러면 주 팩트 표에 여러 개의 중복 행이 저장됩니다. 이러한 데이터를 구성하는 훨씬 더 간결한 방법인 VIOLATION CODE를 사용합니다(세 글자 문자열 대 문장 길이의 문자열).
다시 한 번, Query Builder를 사용하여 고유한 레스토랑 인구 통계를 벗겨냅니다. NYC에 같은 이름의 피자 가게가 두 개 이상 있을 가능성이 매우 높지만 Query Builder는 이러한 상황을 처리할 수 있습니다. CAMIS 열은 고유한 레스토랑을 식별하는 데 사용할 수 있는 ID로 기능합니다. Query Builder에서 CAMIS를 두 번 끌어다 놓습니다. 그 중 하나는 Aggregated by count이고 INSPECTION COUNT로 이름을 바꿔야 합니다. 나머지 인구 통계 데이터는 DBA, BORO, BUILDING, STREET, ZIPCODE, PHONE 및 CUISINE DESCRIPTION입니다. 마지막으로 지오코더에 대한 ADDRESS라는 열을 계산합니다. 이는 쿼리 후 스크립트로 수행됩니다. 쿼리를 실행한 다음 다음 수식이 있는 수식 열을 활용합니다.
:건물 ||" "|| :거리 ||" "|| :보로 ||"뉴욕,"||숯( :우편번호)
이 공식은 올바른 주소를 구성합니다. 입력:주소 <<스크립트를 받으세요; 스크립트 편집기에서 쿼리 후 스크립트에 대한 열을 생성하는 데 필요한 JSL을 생성합니다. 해당 코드를 쿼리 빌더의 해당 탭에 복사하여 붙여넣은 다음 지오코드와의 더 나은 인터페이스를 위해 데이터를 20개 그룹으로 분할하는 열을 생성합니다. 그룹 및 데이터 초기화: 데이터 순서, 1에서 20까지, 1단계, 1단계 반복이라는 새 열을 생성한 후 스크립트를 가져와 쿼리 후 스크립트에 붙여넣을 수 있습니다. 이제 두 열이 모두 스크립트이므로 쿼리 테이블을 삭제하고 쿼리를 다시 실행할 수 있습니다. 이 데이터 테이블을 다음과 같이 저장합니다.D-레스토랑.jmp. 마지막 단계로, DBA, BORO, BUILDING, STREET, ZIPCODE, PHONE, CUISINE DESCRIPTION 등의 추가 열을 현재 사실 테이블에서 삭제합니다.
이 표를 다음과 같이 저장하세요 F-검사.jmp. 이제 Xan Gregg가 만든 애드인으로 레스토랑 그룹을 지오코딩할 준비가 되었습니다. 이 애드인은 JMP 파일 교환[GREGG]에서 사용할 수 있으며, OpenStreetMaps.org를 사용하여 위치를 지오코딩합니다. 이 서비스는 계산 비용이 많이 들고 실패하기 쉽기 때문에 분할하는 것이 가장 좋습니다.D-레스토랑 Tables > Subset을 사용하여 그룹별로. 그림 10에 표시된 이 플랫폼의 Subset By 기능이 여기서 유용합니다.

그림 10. 레스토랑 그룹별 분할을 위한 하위 집합 테이블 플랫폼
새로 만든 20개의 테이블은 애드인을 사용하여 개별적으로 지오코딩할 수 있습니다. 주소 필드는 올바른 위도와 경도를 결정하는 데 도움이 됩니다. 마지막으로 결과를 동일한 데이터 테이블에 저장합니다.
위치가 포함된 단일 차원 테이블로 데이터 테이블을 되돌리려면 테이블 > 연결 함수를 사용하여 20개 그룹을 결합합니다. 이 함수의 이름은 다음과 같습니다. D-레스토랑위치.jmp.
이제 쿼리 빌더를 사용하여 이 테이블을 분해했으므로 가상 조인을 사용하여 다시 빌드할 수 있습니다.
먼저, 두 가지 차원의 테이블부터 시작하겠습니다. 레스토랑-wLocation.jmp 그리고위반 코드.jmp. VIOLATION CODE를 마우스 오른쪽 버튼으로 클릭하고 Link ID를 선택하면 가상 조인의 시작이 설정됩니다. 열 목록에 작은 키 아이콘이 표시됩니다. Restaurants 테이블로 이동하여 CAMIS에서도 동일한 작업을 수행합니다. 가상 조인을 완료하려면 모든 검사가 있는 팩트 테이블로 이동한 다음 CAMIS와 VIOLATION CODE에 대한 Link Reference를 선택합니다.
모든 열은 메모리에서 테이블을 물리적으로 조인하지 않고도 팩트 테이블에 표시됩니다. 가상 조인은 열 속성을 통해 스크립팅할 수도 있습니다.
링크 참조:
속성 설정("링크 참조", 참조 테이블("D(f)-Restaurants-wLocation.jmp"));
링크 ID의 경우:
속성 설정("링크 ID", 1);

그림 11. 가상 조인
그림 11은 팩트 테이블에 부담을 주지 않고도 두 차원 테이블의 열에 액세스할 수 있음을 보여줍니다.
마지막으로, 가상으로 결합된 열을 활용하여 이러한 데이터를 시각화하고 탐색할 수 있는 대시보드를 구축합니다.
그림 12는 Dashboard Builder가 5개의 그래프 모음을 표시하는 방식을 보여줍니다. 그래프 중 두 개를 선택 필터로 사용하려면 Dashboard Builder의 계층 필터 템플릿으로 시작하여 CRITICAL FLAG와 BORO를 필터와 계층 필터로 사용합니다. 다음으로, 등급 카운트 그래프, 지도에 분위수별 평균 점수, 마지막으로 검사 유형별 날짜 카운트의 열 지도를 사용합니다.

그림 12. 최종 NYC 검사 대시보드가 있는 Application Builder의 대시보드 빌더 모드
이는 가상 조인이 제공하는 연결된 테이블을 활용하여 이러한 데이터로 만들 수 있는 시각화 유형의 예일 뿐입니다. 지오코딩된 데이터를 사용하면 예를 들어 요리별로 레스토랑의 위치를 파헤칠 수도 있습니다(그림 13).

그림 13. 거리 수준 지도에 표시된 등급별로 색상이 지정된 지오코딩된 레스토랑
SQL 생성 및 배포
Query Builder를 사용하는 또 다른 주요 이점은 구조화된 쿼리 언어(SQL)의 생성입니다. SAS는 Proc SQL 내에서 SQL을 사용할 수 있으며, 대부분의 데이터베이스는 SQL을 프로그래밍 언어로 사용하여 테이블을 조인하고 관리합니다. SQL은 Query Builder의 포인트 앤 클릭 인터페이스에서 정의한 쿼리에서 생성할 수 있습니다.
아래는 모든 차원 테이블을 조인된 테이블에 조인하기 위해 Query Builder에서 생성한 SQL입니다.시리즈.jmp그리고AllData.jmp(케이스 1에서) 그리고 조인의 SQL전체 join.jmp그리고 모든_코드.jmp테이블.라이브러리 이름문장, 테이블의 연관된 libname 참조 및과정 SQL을 문장이 추가되었습니다. 나머지 코드는 Query Builder에서 생성되었습니다.
대부분의 코드가 SELECT 문 내의 열 목록이라는 점에 유의하세요. 사용자가 SQL을 알고 있더라도 Query Builder를 사용하여 이러한 코드를 생성하는 것은 큰 도움이 됩니다. 필요하지 않은데 왜 그렇게 많은 테이블과 열 이름을 입력해야 합니까?
라이브러리 이름 원천 '파일 위치';
과정 SQL을;
만들다 테이블소스.데이터N시리즈~처럼
선택하다t1.년도, t1.기간, t1.값, t1.각주_코드,
t2.lfst_코드, t2.주기_코드, t2.시리즈_제목, t2.절대_코드,
t2.활동_코드, t2.연령_코드, t2.수업_코드, t2.기간_코드,
t2.교육_코드, t2.진입_코드, t2.식별_코드, t2.헤더_코드,
t2.시간 코드, t2.인디 코드, t2.jdes 코드, t2.룩 코드,
t2.mari_코드, t2.mjhs_코드, t2.직업_코드, t2.원본_코드,
t2.pcts_코드, t2.레이스_코드, t2.rjnw_코드, t2.rnlf_코드,
t2.rwns_코드, t2.탐색_코드, t2.섹스_코드, t2.tdat_코드,
t2.수의사_코드, t2.주간_코드, t2.태어난_코드, t2.어린이_코드,
t2.disa_code, t2.seasonal, t2.footnote_codes, t2.begin_year,
t2.시작_기간, t2.종료_연도, t2.종료_기간에서소스.AllData 티1
왼쪽OUTER JOIN 소스.시리즈 t2
에 (t1.시리즈_아이디 = t2.시리즈_아이디) ;
선택하다t1.년도, t1.기간, t1.값, t1.시리즈_제목,
t1.계절, t1.시작_년도, t1.시작_기간, t1.종료_년도,
t1.종료_기간, t13.각주_텍스트, t34.주간_텍스트, t33.재향군인_텍스트,
t32.tdat_text, t31.sex_text, t30.seek_text, t29.rwns_text,
t28.rnlf_텍스트, t27.RJNW_텍스트, t26.레이스_텍스트, t25.주기_텍스트,
t24.pcts_text, t23.orig_text, t22.직업_text, t21.mjhs_text,
t20.마리_텍스트, t19.룩_텍스트, t18.lfst_텍스트, t17.jdes_텍스트,
t16.인디_텍스트, t15.시간_텍스트, t14.h헤더_텍스트, t12.expr_텍스트,
t11.입학_텍스트, t10.교육_텍스트, t9.기간_텍스트, t8.이사_텍스트,
t7.학급 텍스트, t6.어린이 텍스트, t5.태어난 텍스트, t4.연령대 텍스트,
t3.활동_텍스트, t2.무작위_텍스트에서소스.데이터N시리즈 티1
왼쪽OUTER JOIN 소스.각주 t13
에 (t1.각주_코드 = t13.각주_코드)
왼쪽OUTER JOIN 소스.wkst t34
에 (t34.wkst_code = t1.wkst_code)
왼쪽외부 조인 소스.vets t33
에 (t33.수의사_코드 = t1.수의사_코드)
왼쪽외부 조인 소스.tdat t32
에 (t32.tdat_코드 = t1.tdat_코드)
왼쪽외부 조인 소스.섹스 t31
에 (t31.섹스코드=t1.섹스코드)
왼쪽OUTER JOIN 소스.seek t30
에 (t30.탐색_코드 = t1.탐색_코드)
왼쪽외부 조인 소스.rwns t29
에 (t29.rwns_코드 = t1.rwns_코드)
왼쪽OUTER JOIN 소스.rnlf t28
에 (t28.rnlf_코드 = t1.rnlf_코드)
왼쪽OUTER JOIN 소스.rjnw t27
에 (t27.RJNW_CODE = t1.rjnw_코드)
왼쪽OUTER JOIN 소스.레이스 t26
에 (t26.레이스_코드 = t1.레이스_코드)
왼쪽OUTER JOIN 소스.주기 t25
에 (t25.주기코드 = t1.주기코드)
왼쪽외부 조인 소스.pcts t24
에 (t24.pcts_코드 = t1.pcts_코드)
왼쪽외부 조인 소스.orig t23
에 (t23.원본_코드 = t1.원본_코드)
왼쪽OUTER JOIN 소스.직업 t22
에 (t22.직업코드 = t1.직업코드)
왼쪽외부 조인 소스.mjhs t21
에 (t21.mjhs_코드 = t1.mjhs_코드)
왼쪽OUTER JOIN 소스.mari t20
에 (t20.마리_코드 = t1.마리_코드)
왼쪽OUTER JOIN 소스.look t19
에 (t19.룩_코드 = t1.룩_코드)
왼쪽OUTER JOIN 소스.lfst t18
에 (t18.lfst_코드 = t1.lfst_코드)
왼쪽OUTER JOIN 소스.jdes t17
에 (t17.jdes_코드 = t1.jdes_코드)
왼쪽OUTER JOIN 소스.indy t16
에 (t16.인디_코드 = t1.인디_코드)
왼쪽OUTER JOIN 소스.시간 t15
에 (t15.시_코드 = t1.시_코드)
왼쪽외부 조인 소스.hheader t14
에 (t14.h헤더_코드 = t1.h헤더_코드)
왼쪽외부 조인 소스.expr t12
에 (t12.식별코드 = t1.식별코드)
왼쪽외부 조인 소스.entr t11
에 (t11.엔트리_코드 = t1.엔트리_코드)
왼쪽OUTER JOIN 소스.교육 t10
에 (t10.교육코드=t1.교육코드)
왼쪽OUTER JOIN 소스.기간 t9
에 (t9.기간_코드 = t1.기간_코드)
왼쪽OUTER JOIN 소스.disa t8
에 ( t8.disa_code = t1.disa_code )
왼쪽OUTER JOIN 소스.클래스 t7
에 (t7.클래스_코드 = t1.클래스_코드)
왼쪽외부 조인 소스.chld t6
에 (t6.chld_code = t1.chld_code)
왼쪽OUTER JOIN 소스.born t5
에 (t5.태어난_코드 = t1.태어난_코드)
왼쪽OUTER JOIN 소스.age t4
에 (t4.연령대코드 = t1.연령대코드)
왼쪽외부 조인 소스.활동 t3
에 (t3.활동_코드 = t1.활동_코드)
왼쪽외부 조인 소스.absn t2
에 (t1.압축_코드 = t2.압축_코드);
그만두다;
요약
분석가는 시각화와 분석이 가능한 방식으로 구성된 하나의 테이블에 데이터가 필요합니다. 그러나, 데이터는 종종 여러 테이블에 로드, 유지 관리 및 저장되도록 구성되므로(정규화됨) 분석가는 여러 테이블을 결합하고 요약하여 하나의 분석에 적합한 테이블로 만드는 데 어려움을 겪습니다.
JMP Query Builder는 JMP 내에서 여러 테이블을 조인하는 강력한 방법입니다. 미리보기 기능을 사용하면 시간이 많이 걸리는 테이블 조인 작업을 실행하기 전에 조인이 제대로 정의되었는지 확인할 수 있습니다. 생성된 SQL은 SAS 또는 데이터베이스에 배포할 수 있으므로 이러한 코드를 직접 작성하는 데 드는 시간을 상당히 절약할 수 있습니다.
참고문헌
[UGSCPS] 노동력 통계 – 현재 인구 조사 – CPS. 2016년 8월 18일 검색됨http://www.bls.gov/cps/data.htm.
[DOHMH] DOHMH 뉴욕시 레스토랑 검사 결과. 2016년 8월 17일 검색됨https://data.cityofnewyork.us/Health/DOHMH-New-York-City-Restaurant-Inspection-Results/xx67-kt59.
[그레그]Gregg, X. (2014년 5월 28일). 지명 지오코딩. 2016년 8월 18일 검색됨,https://community.jmp.com/docs/DOC-6175.