데이터 과학자 및 데이터 분석가의 4가지 SQL 팁

사진은 Campaign Creators 에서 Unsplash
지난 10년 동안 SQL은 업계와 업무 전반에 걸쳐 일반적인 기술 요구 사항이 되었습니다. 
아마존과 구글 같은 회사들은 일반적으로 그들의 데이터 분석가, 데이터 과학자, 제품 매니저에게 적어도 SQL에 익숙해지도록 요구한다.SQL이 여전히 데이터 언어이기 때문입니다.따라서 데이터 구동을 실현하기 위해서는 데이터에 어떻게 접근하고 분석하는지 알아야 한다.
이렇게 많은 사람들이 데이터를 보고, 절단하고, 조작하고, 분석하고 있는데, 우리는 SQL을 개선하는 데 도움을 줄 수 있는 기교를 제공하고 싶다.
이러한 기술과 기술은 우리가 SQL을 작성할 때 배운 것이다.전반적으로 말하자면, 우리는 그것들이 당신이 SQL을 새로운 수준으로 향상시키는 데 도움을 줄 수 있기를 바랍니다.
이 중 일부는 유혹을 받을 수도 있지만, 다른 일부는 데이터를 신뢰할 수 있도록 하는 최선의 방법입니다.전반적으로 정보를 제공하고 미래에 발생할 수 있는 두통을 줄이기 위해서다.

평균적으로 Avg () 를 사용하지 마십시오.


우리가 사람들의 조회에서 본 흔한 오류 중 하나는 평균치이다.어떤 사람들은 이것이 분명히 평균 수준이 아니라고 생각할 수도 있다.그러나 일부 토론과 문장은 왜 인터넷에서 평균적으로 좋지 않은지 설명한다.
그렇다면 왜 SQL과 일반적인 상황에서 평균치가 좋지 않습니까?더 적은 평균치를 바탕으로 하는 평균치에 의해 왜곡될 수 있기 때문이다.
예를 들어 다음 표를 봅시다.

표에서 우리는 이미 현 1급의 매번 클레임 원가를 평균하였다.우리는 또 한 현의 평균 수는 100건의 클레임을 바탕으로 하고, 다른 하나는 2건의 클레임을 바탕으로 하는 것을 볼 수 있다.일반적으로 말하면, 이 시계는 클레임 총수가 없을 수도 있다. 우리는 그것을 이용해서 네가 얼마나 쉽게 평균치를 왜곡할 수 있는지 보여 준다.
만약 우리가 모든 현의 평균치를 찾고 싶다면?만약 네가 평균을 시험해 본다면, 너는 525달러를 받을 것이다.이것은 옳지 않은 것 같다.
만약 100건의 클레임의 평균 금액이 50달러이고 2건의 클레임의 평균 금액이 100달러라면 이 모든 가치의 평균 금액은 500달러가 아니라 50달러에 가까워야 한다.
실제로 이 클레임의 평균 금액은 약 68달러다.그러나 평균치를 균등하게 하면 얻는 숫자는 거의 10배나 크다.
그렇다면 왜 사람들은 평균치까지 물어볼 수 있을까?
우리는 때때로 평균치가 예상 출력에 가까울 수도 있다고 생각한다.
SQL 예제를 살펴보겠습니다.
SELECT patient_county
    ,avg(avg_visits_per_patient)*1.0 avg_visits
    ,avg(avg_cost_per_patient)*1.0 avg_cost
    ,'Avg of Averages' table_type
FROM agg_patient_counties 
GROUP BY patient_county,table_type
이런 상황에서 우리는 하나의 표를 사용할 것이다. 이 표는 각 환자의 평균 비용과 각 환자의 평균 진료 횟수(현과 연령별)를 포함한다.
그러나 우리는 현급 환자 한 명의 평균 비용과 환자 한 명의 진료 횟수를 찾기를 희망한다.
우리는 위의 조회를 사용하여 이 표의 평균 값을 평균할 수 있으며, 이것은 우리에게 아래의 출력을 제공할 것이다.

현재, 만약에 우리가 정확하게 조회를 작성하려면 현의 입도에서 평균치를 다시 계산해야 한다. 예를 들어 아래의 조회:
SELECT 
    patient_county
    ,count(*)*1.0/count(distinct c.patient_id) avg_total_visits
    ,sum(cast(claim_cost AS decimal))/count(distinct c.patient_id) avg_total_costs
    ,'Correct Way' as table_type
FROM patients p
JOIN claims c ON p.patient_id = c.patient_id
GROUP by patient_county,table_type
이제 이 조회 출력을 이전의 출력과 비교합시다.

당신은 금현 산출 중의 일부 차이를 알아차릴 것입니다.
따라서 만약에 우리가 평균 방문량을 비교한다면 그것들은 실제로는 2.4에서 2.6과 매우 유사해 보인다.이것이 바로 우리가 어떤 사람들이 평균 수준에 치우칠 것이라고 믿는 이유다.그것들은 때때로 실제 출력에 접근할 수 있기 때문에 이런 방법을 사용하는 것은 매우 유혹적이다.
그러나 우리가 모든 클레임의 평균 원가를 볼 때.우리는 560달러와 620달러 사이에 58달러에 가까운 차액이 있다는 것을 알아차릴 것이다.이것은 거의 10퍼센트다.네가 원가 절약에 대해 이야기할 때, 이것은 매우 큰 차이이다.
따라서 2.4와 2.6은 무시할 수 있지만 큰 차이를 초래할 수 있다.
마지막으로 고르지 마세요.

Sum에서 Case 문구 사용 가능


SQL을 작성하는 또 다른 좋은 기교는sum 자문에서case문장을 어떻게 사용하는지 배우는 것이다.비율이나 분자로 지표를 작성하려고 시도할 때, 이것은 매우 유용할 수 있습니다.
예를 들어 아래의 조회를 봅시다.필터링하려는 값의 계수와 본점 수를 얻기 위해 표를 두 번 눌러야 합니다.그러나 우리는 이런 상황을 줄일 수 있다.
SELECT total_claims_over_500 * 100.0 / COUNT(*)
FROM claims
JOIN (
    SELECT COUNT(*) total_claims_over_500
    FROM claims
    WHERE CAST(claim_cost AS INT) > 500
    ) t1 ON 1 = 1
GROUP BY total_claims_over_500
우리는 조건이true일 때의 총액을 계산한 다음, 아래의 검색에서 보듯이 총 계수로 나눌 수 있는case 문장을 작성할 수 있다.
SELECT SUM(CASE 
        WHEN CAST(claim_cost AS INT) > 500
            THEN 1
        ELSE 0
        END) * 100.0 / COUNT(*) perc_claims_over_500
FROM claims
너는 우리가 책상 위에서 두 번 두드리지 않아도 이 두 개의 숫자를 얻을 수 있다는 것을 알아차릴 것이다.이 밖에 이것은 더욱 읽기 쉽다.
우리의 경험에 따르면 대부분의 SQL 개발자들은 SQL을 사용한 첫해나 이듬해 어느 때 이 기교를 사용한다. 
행의 빈값 비율을 계산하는 코드나 계기판의 지표를 작성할 때 매우 유용하다.반대로, 이것이 바로 많은 분석가와 데이터 엔지니어들이 드래그 솔루션뿐만 아니라 대량의 SQL을 작성해야 하기 때문에 이 기교를 익힐 것이다.

수조와 그것들을 어떻게 조작하는지 이해하다


데이터베이스 테이블의 수조와 맵은 흔하지 않다.그러나 우리는 점점 더 많은 단체가 비구조화된 데이터에 의존하고 구조화된 데이터가 아니라 일반적으로 수조와 수조 함수 등 데이터 구조를 이용할 수 있음을 알아차렸다.
Postgres 같은 데이터베이스나 Presto 같은 SQL 엔진이 조회에서 그룹을 처리할 수 있도록 하기 때문입니다.
비록 수조와 매핑은 새로운 개념이 아니지만, 프로그래밍에 익숙하지 않은 분석가와 데이터 과학자들에게는 새로운 개념이다.
이것은 데이터를 추출하기 위해 가끔 수조와 매핑 함수를 배워야 한다는 것을 의미한다.
presto에서 지도 검색을 취소하는 방법을 배우는 것부터 시작합시다.지도는 키 제공: 값 관계의 데이터 구조이다.이것은 "first\u name": "George"와 같은 값에 대한 특정한 설명을 제공하는 유일한 키를 제공할 수 있음을 의미합니다.지도에도 다음 그림과 같이 여러 개의 키 값 쌍이 포함될 수 있다.
이 경우, 우리는 두 개의 키, dob와 friend_id를 가지고 있으며, 그것들을 방문하고 싶습니다.

그러면 우리는 어떻게 이 데이터에 접근합니까?아래의 조회를 봅시다.

SELECT username
    ,key
    ,value
FROM user_info u
    ,json_each_text(user_data) i

보시다시피 키와 값에 대한 줄을 정의할 수 있습니다.따라서 우리가 데이터를 추출할 때 특정한 데이터 유형을 얻을 수 있다.
출력은 다음 그림과 같습니다.

수조의 길이를 확인하고 특정 키를 찾을 수 있습니다 read more about presto arrays here.우리는 당신이 지도와 진열만 양호한 데이터 모델링의 대체품으로 사용하지 않기를 건의합니다.그러나 특정 패턴이 필요하지 않을 수도 있는 데이터를 처리할 때 유용합니다.

자동 연결을 피하기 위해 앞뒤로 및 뒤로 이동


마지막으로 연결을 피하기 위해 초전과 정지 창 함수를 사용하는 것에 대해 토론해 봅시다. 
분석을 진행할 때, 통상적으로 두 사건의 출력을 비교하거나 두 사건 사이의 시간량을 계산해야 한다.
이렇게 할 수 있는 방법 중 하나는 시계를 자신에 연결하고 두 줄을 연결하는 것이다.그러나 또 다른 멋진 SQL 함수는 정체와 초전 함수이다.
이렇게 하면 지정한 정체 또는 초과 값을 참조할 수 있습니다.정지 값과 초과 값을 얻을 입도를 지정할 수도 있습니다.
예를 들어 아래의 조회에서 우리는 환자 id에 따라 정체치와 선도치를 구분한다. 이것은 우리가 환자 등급의 정체와 선도 클레임 날짜와 클레임 원가에만 관심을 가진다는 것을 의미한다.

WITH claim_cte
AS (
    SELECT patient_id
        ,claim_date claim_date
        ,claim_cost
        ,lag(claim_date) OVER (
            PARTITION BY patient_id ORDER BY claim_date
            ) previous_claim_date
        ,lag(claim_cost) OVER (
            PARTITION BY patient_id ORDER BY claim_date
            ) previous_claim_cost
    FROM claims
    )
SELECT claim_date - previous_claim_date days_between_dates
    ,patient_id
    ,claim_date
    ,claim_cost
    ,previous_claim_date
    ,previous_claim_cost
FROM claim_cte

이 조회의 출력은 아래 표와 같다.

당신은 모든 환자의 첫 번째 날짜에 대해 정지 클레임 날짜와 원가가 비어 있다는 것을 알게 될 것입니다.이것은 이전에 원가나 클레임 날짜가 없었기 때문이다. 
전반적으로 말하자면 lag와 lead 함수는 SQL 개발자의 생활을 더욱 간단하게 할 수 있다. 

자세한 내용은 SQL 관련


SQL remains the language of data and learning 이러한 알림과 기교는 다음 대시보드나 분석을 확보하는 데 도움이 됩니다.평균치를 피하든 데이터 품질 검사를 작성하든 이런 작은 개선은 큰 영향을 미칠 수 있습니다.그중 일부 문제는 회사에서 매우 큰 논쟁과 토론을 일으켰기 때문에 우리는 이것이 당신들 중의 많은 사람들이 진도를 가속화하는 데 도움을 줄 수 있기를 바랍니다.
또한 이러한 SQL 프롬프트를 따른다면 데이터 분석이 더욱 정확해지고 제공된 숫자에 대해 더욱 자신감을 가질 수 있습니다. 
읽어주셔서 감사합니다.
Kafka Vs RabbitMQ
Data Engineering 101: An Introduction To Data Engineering
What Are The Different Kinds Of Cloud Computing
SQL Best Practices --- Designing An ETL Video
5 Great Libraries To Manage Big Data With Python
Joining Data in DynamoDB and S3 for Live Ad Hoc Analysis

좋은 웹페이지 즐겨찾기