<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>짱구는 코딩중</title>
        <link>https://velog.io/</link>
        <description>코린이</description>
        <lastBuildDate>Wed, 10 Apr 2024 00:37:08 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>짱구는 코딩중</title>
            <url>https://velog.velcdn.com/images/shin-ms/profile/11f6c894-77de-4a7f-91a0-eca85be7821f/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 짱구는 코딩중. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/shin-ms" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[TIL] 인덕서(Indexer) & 인덱싱(Indexing)]]></title>
            <link>https://velog.io/@shin-ms/%EC%9D%B8%EB%8D%95%EC%84%9CIndexer-%EC%9D%B8%EB%8D%B1%EC%8B%B1Indexing</link>
            <guid>https://velog.io/@shin-ms/%EC%9D%B8%EB%8D%95%EC%84%9CIndexer-%EC%9D%B8%EB%8D%B1%EC%8B%B1Indexing</guid>
            <pubDate>Wed, 10 Apr 2024 00:37:08 GMT</pubDate>
            <description><![CDATA[<h1 id="인덕서-indexer">인덕서 (Indexer)</h1>
<p><strong>인덱서(Indexer)</strong>는 데이터 구조에서 데이터를 선택(조작)하기 위한 인터페이스를 제공하는 객체이다.
판다스에서 주로 사용되는 인덱서에는 loc 및 iloc이 있다.</p>
<h3 id="✅-인덱스-indexer-vs-인덕서-indexer">✅ 인덱스 (Indexer) vs 인덕서 (Indexer)</h3>
<p><strong>인덱스(Index)</strong>는 데이터 구조에서 행이나 열에 대한 레이블을 저장하는 객체로 데이터에 접근하고 행 또는 열을 고유하게 식별하는 데 사용된다.</p>
<p>인덱스와 인덕서의 개념 차이는 사용 방법과 이유에 따라 조금 틀려진다. 인덱스는 데이터에 대한 레이블을 저장하고 접근하는 객체이며, 인덱서는 데이터를 선택하고 조작하는 데 사용되는 인터페이스입니다.</p>
<hr>
<h1 id="인덱싱indexing">인덱싱(Indexing)</h1>
<p><strong>인덱싱(Indexing)</strong>은 데이터 구조에서 특정 데이터를 선택하거나 접근하는 것을 말한다. </p>
<p>인덱싱은 일반적으로 행이나 열의 위치나 레이블을 사용하여 데이터를 선택(조작)하는 작업을 의미한다. 데이터프레임에서 특정 열이나 행을 선택하거나, 시리즈에서 특정 위치에 있는 값을 가져오는 것을 인덱싱이라 부른다.</p>
<hr>
<h1 id="인덱서의-종류">인덱서의 종류</h1>
<p>인덱스 값을 활용하여 특정 인덱스에 해당하는 값을 추출할 수 있다.</p>
<p>인덱스의 값이 라벨(문자타입)인 경우 <code>.loc[ ]</code>와 <code>.at[ ]</code>를 사용하며, 인덱스 값이 정수인 경우 <code>.iloc[ ]</code>와 <code>.iat[ ]</code>를 사용한다.</p>
<blockquote>
<h3 id="-">[ ]</h3>
<p><strong>Bracket Indexing</strong>
라벨(인덱스 이름) 혹은 인덱스의 번호를 사용하여 데이터에 접근하는 방법</p>
</blockquote>
<h3 id="loc-">.loc[ ]</h3>
<p><strong>Label-Based Indexing</strong>
라벨(인덱스 이름)을 사용하여 데이터에 접근</p>
<blockquote>
</blockquote>
<h3 id="iloc-">.iloc[ ]</h3>
<p><strong>Integer-Based Indexing</strong>
인덱스의 번호를 사용하여 데이터에 접근</p>
<blockquote>
</blockquote>
<h3 id="at-">.at[ ]</h3>
<p><strong>Fast Label-Based Indexing</strong>
<code>.loc[]</code>와 유사한 기능을 가지고 있지만, 스칼라(Scalar) 값을 가져오는데 있어 최적화된 방법</p>
<blockquote>
</blockquote>
<h3 id="iat-">.iat[ ]</h3>
<p><strong>Fast Integer-Based Indexing</strong>
<code>.iloc[]</code>와 유사한 기능을 가지고 있지만, 스칼라(Scalar) 값을 가져오는데 있어 최적화된 방법</p>
<hr>
<h1 id="불리언boolean-인덱싱">불리언(Boolean) 인덱싱</h1>
<p>참 또는 거짓 값을 가지는 조건을 활용하여 데이터를 선택(조작) 하는 방법으로 다양한 조건문과 속성, 메서드 등을 활용하여 특정 데이터에 접근할 수 있다.</p>
<p>아래 판다스 공식 사이트에 들어가면 다양한 방법의 인덱싱 방법을 확인 할 수 있다.
<a href="https://pandas.pydata.org/docs/user_guide/indexing.html#slicing-ranges"><strong>Pandas Indexing User Guide</strong></a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL]판다스(Pandas) (With 데이터 구조)]]></title>
            <link>https://velog.io/@shin-ms/%ED%8C%90%EB%8B%A4%EC%8A%A4Pandas-With-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@shin-ms/%ED%8C%90%EB%8B%A4%EC%8A%A4Pandas-With-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Tue, 09 Apr 2024 08:21:14 GMT</pubDate>
            <description><![CDATA[<h1 id="판다스pandas">판다스(Pandas)</h1>
<p><strong>판다스(Pandas)</strong>는 <strong>파이썬 기반의 대표 라이브러리</strong>로 오늘날 데이터 분석(Data Analyst)과 데이터 사이언스(Data Science)에 핵심으로 사용되고 있다.</p>
<p>특히 <strong>표 형식의 데이터를 다루는 데 있어 효과적</strong>이다. 데이터를 불러오고, 처리하고, 조작, 필터링, 그룹화, 결합 등 다양한 작업에 활용되고 있다.</p>
<h2 id="✅-판다스pandas-사용">✅ 판다스(Pandas) 사용</h2>
<blockquote>
<p>conda를 활용하여 쉽게 설치할 수 있다.</p>
</blockquote>
<pre><code>(설치할 컴퓨터) xxx ~ % conda install pandas</code></pre><p>정상 설치가 완료되었다면 <code>import</code>를 사용하여 pandas를 불러올 수 있다.</p>
<pre><code class="language-python">import pandas as pd</code></pre>
<br>

<h1 id="판다스pandas의-데이터-구조">판다스(Pandas)의 데이터 구조</h1>
<p>판다스(Pandas)에서는 대표적인 데이터 구조 2개가 존재한다.</p>
<p>하나는 1차원 데이터 구조로 이루어진 시리즈(Series)가 있고, 또 하나는 2차원 데이터 구조로 이루어진 데이터프레임(DataFrame)이 있다.</p>
<h2 id="✅-시리즈series와-데이터프레임dataframe">✅ 시리즈(Series)와 데이터프레임(DataFrame)</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/shin-ms/post/84bba884-76b4-4e1e-9a2c-bd6a7fc8e1c7/image.png" alt=""></p>
<p><strong>시리즈(Series)</strong>는 <strong>1차원 데이터 구조</strong>로, 인덱스(index)와 인덱스에 대응하는 데이터(values)로 이루어져 있다.</p>
</blockquote>
<p><strong>데이터프레임(DataFrame)</strong>은 <strong>2차원 데이터 구조</strong>로, 행(row)과 열(column)으로 이루어져 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[주피터 노트북(With Apple Silicon)]]></title>
            <link>https://velog.io/@shin-ms/%EC%A3%BC%ED%94%BC%ED%84%B0-%EB%85%B8%ED%8A%B8%EB%B6%81-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95Apple-Silicon</link>
            <guid>https://velog.io/@shin-ms/%EC%A3%BC%ED%94%BC%ED%84%B0-%EB%85%B8%ED%8A%B8%EB%B6%81-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95Apple-Silicon</guid>
            <pubDate>Mon, 08 Apr 2024 11:59:42 GMT</pubDate>
            <description><![CDATA[<h1 id="주피터-노트북jupyter-notebook">주피터 노트북(Jupyter Notebook)</h1>
<p>주피터 노트북(Jupyter Notebook)은 데이터 분석, 머신러닝, 인공지능 등 다양한 작업을 수행할 수 있는 <strong>대화형 개발 환경</strong>이다.
또한 웹 브라우저에서 실행된다는 특징을 가지고 있으며 코드, 텍스트, 시각화 및 기타 <strong>내용을 하나의 문서에 통합</strong>할 수 있는 특징을 가지고 있다.</p>
<h1 id="아나콘다anaconda">아나콘다(Anaconda)</h1>
<p>데이터 작업에 사용되는 여러 패키지를 기본으로 포함하고 있는 <strong>파이썬 배포판</strong>이다.
또한, 아나콘다는 &quot;conda&quot;를 사용하여 파이썬 기반의 <strong>가상 환경을 쉽게 구축 및 관리</strong>할 수 있다.(프로젝트별로 패키지 의존성을 분리하여 작업)</p>
<h1 id="환경-설정">환경 설정</h1>
<blockquote>
<h3 id="✅-1-maxos-개발환경-구축">✅ 1. maxOS 개발환경 구축</h3>
<p>maxOS 환경에서 프로그래밍 언어를 사용하기 위해서 설치해야 한다.</p>
</blockquote>
<pre><code class="language-linux">## 설치
xxx ~ % xcode-select --install
&gt;
## 설치 확인
xxx ~ % xcode-select --version</code></pre>
<blockquote>
</blockquote>
<br>
>
### ✅ 2. Homebrew
macOS 소프트웨어 패키지를 관리하는 프로그램이다.
Homebrew 설치를 통해 다양한 패키지를 쉽게 설치/삭제할 수 있다.
>
![](https://velog.velcdn.com/images/shin-ms/post/8f2aee9b-140a-449a-9ccd-4dd97f74ae45/image.png)
>
홈페이지에 나와있는 설치 코드를 복사하여 설치할 수 있다.
```linux
## 설치
xxx ~ % /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
>
## 설치 확인
xxx ~ % brew --version
```
>
<br>
>
### ✅ 3. minifoge(Apple Silicon에 최적화된 아나콘다 패키지)
minifoge는 Apple Silicon에 최적화된 아나콘다 패키지이며, Homebrew를 설치했다면 코드 한 줄로 설치할 수 있다.
```linux
## 설치
xxx ~ % brew install miniforge
```
>
컴퓨터에 아나콘다 minifoge를 설치한 후 터미널에 들어가면 $기호 왼쪽에 "(base)"라는 문구가 추가된다.
>
참고로 base는 기본(메인) 컴퓨터 환경을 의미한다.
```
## 설치 후 모습
(base) xxx ~ % 
```
>
<br>
>
### ✅ 4. 가상 환경 컴퓨터 만들기
가상 환경 컴퓨터는 conda를 사용하여 만들 수 있다.
프로젝트에 맞는 가상 환경 컴퓨터 이름과 파이썬 버전을 선택하여 구축할 수 있다.
```
## 사용 문법
(base) xxx ~ % conda create -n <가상 환경 컴퓨터 이름> python=3.X
>
## 예시
(base) xxx ~ % conda create -n data_project python=3.8
```
>
<br>
>
### ✅ 5. 가상 환경 컴퓨터 동작
conda를 사용하여 특정 가상 환경 컴퓨터를 사용할 수 있다.
```
## 사용 문법
(base) xxx ~ % conda activate <가상 환경 컴퓨터 이름>
>
## 예시
(base) xxx ~ % conda activate data_project
```
>
<br>
>
### ✅ 6. 가상 환경 컴퓨터 중지
conda를 사용하여 특정 가상 환경 컴퓨터를 중지할 수 있다.
`conda deactivate`명령어를 사용할 경우 기본(메인) 컴퓨터로 이동하게 된다.
```
## 사용 문법
(data_project) xxx ~ % conda deactivate
```
>
<br>
>
### ✅ 7. 설치한 가상 환경 컴퓨터 확인
conda를 사용하여 사용자가 설치한 가상 환경 컴퓨터 리스트를 확인 할 수 있다.
```
## 사용 문법
(base) xxx ~ % conda env list
```
>
<br>
>
### ✅ 8. 설치한 가상 환경 컴퓨터 삭제
conda를 사용하여 사용자가 설치한 가상 환경 컴퓨터를 삭제할 수 있다.
```
## 사용 문법
(base) xxx ~ % conda env remove -n <가상 환경 컴퓨터 이름>
>
## 예시
(base) xxx ~ % conda env remove -n data_project
```
>
<br>
>
### ✅ 9. 가상 컴퓨터에 주피터 노트북 설치
가상 컴퓨터에서 주피터 노트북을 사용하기 위해서는 아래와 같은 명령어를 입력해야 한다.
(ipykernel의 경우 주피터 노트북을 사용하는 데 있어 필수 옵션(라이브러리)은 아니지만, 커널 간 빠른 이동을 위해 같이 설치하는 게 좋다.)
```
## 사용 문법
(설치할 컴퓨터) xxx ~ % conda install -y jupyter ipykernel
>
## 예시
(base) xxx ~ % conda install -y jupyter ipykernel
```
>
<br>
>
### ✅ 10. 주피터 노트북 실행
아래 명령어를 사용하면 기본으로 설정된 웹 브라우저를 통해 주피터 노트북 웹 페이지가 열리게 된다.
```
(실행할 컴퓨터) xxx ~ % jupyter notebook
```]]></description>
        </item>
        <item>
            <title><![CDATA[PySpark]]></title>
            <link>https://velog.io/@shin-ms/PySpark</link>
            <guid>https://velog.io/@shin-ms/PySpark</guid>
            <pubDate>Mon, 01 Apr 2024 21:54:03 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/shin-ms/post/fa8380a1-d559-40bb-b0f7-859834f9ae8e/image.png" alt=""></p>
<h1 id="pyspark">PySpark</h1>
<p><strong>Apache Spark는 기본적으로 JAVA 언어 기반으로 구동 가능한 프레임워크</strong>이다.</p>
<p>하지만 데이터 분석 작업의 경우 대부분 Python 또는 R 언어로 업무를 수행하기 때문에 해당 언어 환경에서 Apache Spark를 사용할 수 있는 전용 인터페이스를 사용해야 한다.</p>
<p><strong>Python 환경에서 Apache Spark를 사용할 수 있는 인터페이스는 PySpark</strong>라 부른다.</p>
<h2 id="✅-pyspark-환경-세팅with-google-colab">✅ pyspark 환경 세팅(with Google Colab)</h2>
<p>로컬(Local)환경에서 pyspark를 사용할 경우 JAVA 버전과 충돌이 발생할 수 있기 때문에 Google Colab을 활용하여 분석을 진행할 예정이다.</p>
<blockquote>
<pre><code class="language-sql"></code></pre>
</blockquote>
<h2 id="jdk-설치">jdk 설치</h2>
<h2 id="pyspark는-java-가상-머신-위에서-동작하기-때문에-jdk가-필요">PySpark는 Java 가상 머신 위에서 동작하기 때문에 JDK가 필요</h2>
<p>!apt-get install openjdk-8-jdk-headless </p>
<blockquote>
</blockquote>
<h2 id="spark-file">spark file</h2>
<h2 id="apache-spark의-압축-파일을-다운로드spark-300-버전을-사용">Apache Spark의 압축 파일을 다운로드(Spark 3.0.0 버전을 사용)</h2>
<p>!wget -q <a href="https://archive.apache.org/dist/spark/spark-3.0.0/spark-3.0.0-bin-hadoop3.2.tgz">https://archive.apache.org/dist/spark/spark-3.0.0/spark-3.0.0-bin-hadoop3.2.tgz</a></p>
<blockquote>
</blockquote>
<h2 id="spark-압축풀기">spark 압축풀기</h2>
<h2 id="다운로드-받은-spark-압축-파일을-압축-해제">다운로드 받은 Spark 압축 파일을 압축 해제</h2>
<p>!tar -xf spark-3.0.0-bin-hadoop3.2.tgz</p>
<blockquote>
</blockquote>
<h2 id="spark-찾기">spark 찾기</h2>
<h2 id="pyspark를-python-환경에서-사용할-수-있도록-하는-findspark-라이브러리를-설치">PySpark를 Python 환경에서 사용할 수 있도록 하는 findspark 라이브러리를 설치</h2>
<p>!pip install findspark</p>
<blockquote>
</blockquote>
<h2 id="캐글-데이터를-다운받기-위해-kaggle-library-설치">캐글 데이터를 다운받기 위해 kaggle library 설치</h2>
<p>!pip install kaggle --upgrade </p>
<blockquote>
</blockquote>
<h2 id="운영체제와의-상호작용을-돕는-다양한-기능을-제공하는-모듈">운영체제와의 상호작용을 돕는 다양한 기능을 제공하는 모듈</h2>
<p>import os 
import findspark</p>
<blockquote>
</blockquote>
<h2 id="환경변수에-path-지정">환경변수에 path 지정</h2>
<p>os.environ[&quot;JAVA_HOME&quot;] = &quot;/usr/lib/jvm/java-8-openjdk-amd64&quot;
os.environ[&quot;SPARK_HOME&quot;] = &quot;/content/spark-3.0.0-bin-hadoop3.2&quot;</p>
<blockquote>
</blockquote>
<h2 id="spark의-경우-잘-찾지-못하는-경우가-있어-findsaprk를-이용">spark의 경우 잘 찾지 못하는 경우가 있어 findsaprk를 이용</h2>
<p>findspark.init() </p>
<hr>
<h2 id="✅-pyspark-사용with-google-colab">✅ pyspark 사용(with Google Colab)</h2>
<p>spark를 사용하기 위해서는** SparkSession 객체를 선언**해야 한다.</p>
<blockquote>
<pre><code class="language-python">from pyspark.sql import SparkSession
</code></pre>
</blockquote>
<p>spark = (                       # &quot;spark&quot;란 이름의 SparkSession 객체
    SparkSession
    .builder
    .appName(&quot;pyspark_test&quot;)
    .master(&quot;local[<em>]&quot;)         # local환경에서 사용, 모든 쓰레드(</em>)를 사용
    .getOrCreate()              # 객체 생성
    )</p>
<pre><code>
---

## ✅ 데이터 불러오기(with Google Colab &amp; Kaggle)

캐글 API를 활용하여 별도의 데이터 다운로드 없이(로컬 저장X) Google Colab에 데이터를 불러오려면 아래와 같은 코드를 활용하면 된다.
&gt;```python
## 캐글에서 받아온 API Token file(kaggle.json)을 Google colab에 업로드
from google.colab import files
files.upload()
&gt;
## kaggle 폴더 생성
!mkdir -p ~/.kaggle/
&gt;
## kaggle 폴더에 kaggle.json 파일 복사 저장
!cp kaggle.json ~/.kaggle/ 
&gt;
## file 접근 권한 할당(600: 소유자 읽기, 쓰기 권한 / 리눅스 퍼미션 참고)
!chmod 600 ~/.kaggle/kaggle.json 
&gt;
## Data Download (캐글 Copy API command)
!&lt;캐글 사이트에서 가져온 &quot;Copy API command&quot;&gt;
&gt;
## 압축풀기
!unzip &lt;압축 파일명&gt;.zip </code></pre><hr>
<h2 id="✅-데이터-읽어오기with-google-colab">✅ 데이터 읽어오기(with Google Colab)</h2>
<p>PySpark와 Pandas는 비슷한 문법을 가지고 있지만, 활용 목적과 용도에 따라 다르게 적합성이 다르다.</p>
<p>PySpark은 대규모 데이터 처리와 분석에 적합한 분산 컴퓨팅 프레임워크이며, Pandas는 상대적으로 작은 데이터셋에 대한 데이터 처리 및 분석에 적합한 라이브러리이다.</p>
<blockquote>
<pre><code class="language-python">df = &lt;SparkSession 객체명&gt;.read.&lt;파일 확장자&gt;(path=&quot;&lt;파일명&gt;&quot;, 옵션...)</code></pre>
</blockquote>
<pre><code>
---

## ✅ 데이터 저장하기(with Google Colab)
**Spark환경에서 대용량 데이터를 처리할 때는 .parquet 확장자로 저장하여 사용하는 것이 효율적이다.**
(parquet 파일은 고성능, 효율적인 압축 및 분산 환경에 최적화된 형식)
&gt;```python
df.write.format(&quot;parquet&quot;).save(
    path = &quot;&lt;parquet파일로 저장할 파일명&gt;&quot;,
    옵션...)</code></pre><hr>
<h2 id="✅-pyspark-sql-vs-dataframe-api">✅ PySpark SQL vs DataFrame api</h2>
<p>PySpark에서는 두 가지 주요 데이터 처리 인터페이스인 PySpark SQL과 DataFrame API가 존재한다.</p>
<h3 id="🟧-pyspark-sql">🟧 PySpark SQL</h3>
<p>PySpark SQL은 Spark에서 구조화된 데이터 처리를 위한 모듈이며, 이 모듈은 SQL 쿼리를 사용하여 데이터를 처리할 수 있다.
또한, PySpark SQL은 SQL 쿼리문을 사용하여 데이터를 다룬다는 특징이 있다.</p>
<h3 id="🟧-dataframe-api">🟧 DataFrame API</h3>
<p>DataFrame API는 분산 데이터 프레임을 다루기 위한 API이며, 데이터를 구조화된 형식으로 처리하고 변환할 수 있다.
또한, DataFrame API는 Python의 Pandas와 유사한 API를 가지고 있다는 특징이 있다.(Pandas에 익숙한 사용자들에게 쉽게 접근 가능)</p>
<h3 id="🟧-pyspark-sql-vs-dataframe-api">🟧 PySpark SQL vs DataFrame API</h3>
<p>PySpark SQL과 DataFrame API는 각각의 장단점을 가지고 있으며, 데이터 처리 작업에 따라 적합한 방식을 채택하여 사용하는 것을 지향해야 한다.</p>
<p>일반적으로 PySpark SQL의 경우 SQL 질의를 사용하여 간단한 데이터 분석 및 처리 작업을 수행하고, 대용량 데이터의 복잡한 변환 및 조작이 필요한 경우 DataFrame API를 사용하는 것이 일반적이다.
(sql쿼리의 유지보수가 힘들다는 단점이 존재하기 때문에 대용량의 데이터를 처리할 때는 DataFrame API를 많이 사용한다.)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Apache Spark]]></title>
            <link>https://velog.io/@shin-ms/Apache-Spark</link>
            <guid>https://velog.io/@shin-ms/Apache-Spark</guid>
            <pubDate>Mon, 01 Apr 2024 21:15:38 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/shin-ms/post/8616d36a-02df-4e6b-8a08-e1c44c9a44ff/image.png" alt=""></p>
<h1 id="apache-spark">Apache Spark</h1>
<p><strong>Apache Spark</strong>는 <strong>대규모 데이터 처리를 위한</strong> 오픈 소스 분산 클러스터 컴퓨팅 프레임워크로 빠른 속도와 유연성을 제공하며, 대규모 데이터 집합을 효율적으로 처리하고 분석할 수 있다. </p>
<p>시스템의 전반적인 성능을 향상시키기 위해 계산 부하량을 여러 노드에 분담하여 처리하는 병렬 처리방식으로 구동한다.</p>
<h2 id="spark의-데이터-처리방식">Spark의 데이터 처리방식</h2>
<p><strong>1. Partition</strong>
데이터를 처리하기 위해 논리적인 청크 단위로 분할하는 과정이며, 각 파티션은 클러스터의 여러 머신에 저장되어 처리되는 단계이다.</p>
<p><strong>2. Transformation</strong>
데이터의 변경을 Spark에게 알리는 단계이며, 이때 실제 데이터 변경 연산은 수행되지 않고 논리적 실행 계획만 생성되는 단계이다.</p>
<p><strong>3. Lazy Evaluation</strong>
연산 명령을 즉시 실행하지 않고, 원본 데이터에 적용할 연산 명령을 그래프 형태로만 세우는 단계이다.
(Action 단계 전까지 전체 데이터 흐름을 최적화하는 역할)</p>
<p><strong>4. Action</strong>
실제 연산을 수행하는 단계이며, Transformation으로부터 결과를 계산하도록 지시한다.</p>
<p><strong>5. Catalyst</strong>
Spark의 옵티마이저 엔진으로 사용자의 쿼리를 분석하고 최적화하여 실행 계획을 생성하는 단계이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL 고득점 Kit] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기]]></title>
            <link>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%ED%8A%B9%EC%A0%95-%EA%B8%B0%EA%B0%84%EB%8F%99%EC%95%88-%EB%8C%80%EC%97%AC-%EA%B0%80%EB%8A%A5%ED%95%9C-%EC%9E%90%EB%8F%99%EC%B0%A8%EB%93%A4%EC%9D%98-%EB%8C%80%EC%97%AC%EB%B9%84%EC%9A%A9-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%ED%8A%B9%EC%A0%95-%EA%B8%B0%EA%B0%84%EB%8F%99%EC%95%88-%EB%8C%80%EC%97%AC-%EA%B0%80%EB%8A%A5%ED%95%9C-%EC%9E%90%EB%8F%99%EC%B0%A8%EB%93%A4%EC%9D%98-%EB%8C%80%EC%97%AC%EB%B9%84%EC%9A%A9-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 24 Mar 2024 22:11:32 GMT</pubDate>
            <description><![CDATA[<h1 id="❓-문제">❓ 문제</h1>
<p>CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 &#39;세단&#39; 또는 &#39;SUV&#39; 인 자동차 중 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬해주세요.</p>
<h1 id="❗️-문제-풀이">❗️ 문제 풀이</h1>
<blockquote>
<pre><code class="language-sql">/*
조건1 : 자동차 종류가 &#39;세단&#39; 또는 &#39;SUV&#39; 인 자동차
조건2 : 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능 (30일 full 대여)
조건3 : 대여 금액이 50만원 이상 200만원 미만
*/
</code></pre>
</blockquote>
<p>with tb as(
    select 
        CAR_ID
    from CAR_RENTAL_COMPANY_RENTAL_HISTORY
    where 1=1
        and (START_DATE &lt;= &#39;2022-11-01&#39; and END_DATE &gt;= &#39;2022-11-01&#39;)    # 대여 기간이 30일 미만 + 11월 이전 대여 ~ 11월 이후 반납
)</p>
<blockquote>
</blockquote>
<p>select 
    C.CAR_ID
    ,C.CAR_TYPE
    ,round((C.DAILY_FEE - (C.DAILY_FEE * (P.DISCOUNT_RATE * 0.01))) * 30, 0) as FEE
from CAR_RENTAL_COMPANY_CAR as C, CAR_RENTAL_COMPANY_DISCOUNT_PLAN as P
where 1=1
    and C.CAR_TYPE = P.CAR_TYPE
    and C.CAR_ID not in (select CAR_ID from tb)
    and P.DURATION_TYPE = &#39;30일 이상&#39;
    and C.CAR_TYPE in (&#39;세단&#39;, &#39;SUV&#39;)
    and round((C.DAILY_FEE - (C.DAILY_FEE * (P.DISCOUNT_RATE * 0.01))) * 30, 0)  between 500000 and 1999999
order by 3 desc, 2, 1 desc</p>
<pre><code>&gt;

# 📚 느낀점
날짜 데이터를 다루는 데 있어 어색한 부분이 있었다.
이번 기회를 통해 SQL에서 날짜 데이터를 다루는 방법을 공부해야겠다.


&lt;br&gt;

---
# 🔗 Reference
https://school.programmers.co.kr/learn/courses/30/lessons/157339</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Error] "Cannot convert non-finite values (NA or inf) to integer"]]></title>
            <link>https://velog.io/@shin-ms/Error-Cannot-convert-non-finite-values-NA-or-inf-to-integer</link>
            <guid>https://velog.io/@shin-ms/Error-Cannot-convert-non-finite-values-NA-or-inf-to-integer</guid>
            <pubDate>Fri, 22 Mar 2024 12:59:41 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/shin-ms/post/d167c83d-876f-45fb-9c2f-ff773d6d1455/image.png" alt=""></p>
<h1 id="🚨-에러-발생">🚨 에러 발생</h1>
<p>구글 코랩 환경에서 실수형(float type) 데이터를 정수형(int type)으로 변환하려는 과정에서 아래와 같은 에러가 발생했다.</p>
<blockquote>
<p><strong><code>&quot;Cannot convert non-finite values (NA or inf) to integer&quot;</code></strong></p>
</blockquote>
<p>에러 내용을 해석해 보면 변환하려는 칼럼에 결측값(NULL/NA) 또는 무한대 값(Inf)이 존재하기 때문에 변환할 수 없다는 내용이다.</p>
<p>변환하려는 칼럼은 무한대 값이 존재할 수 없기 때문에 무한대 값(inf) 아닌 <strong>결측값(NULL/NA)이 에러의 원인으로 추측</strong>했다.</p>
<h1 id="✅-에러-해결">✅ 에러 해결</h1>
<p>구글에 검색해 본 결과 다양한 블로그에서 아래와 같은 방법을 쉽게 찾을 수 있었다.</p>
<blockquote>
<p><strong>NULL 값을 -1로 치환 -&gt; 데이터 타입 변경 -&gt; -1로 치환한 데이터를 다시 NULL로 변환</strong></p>
<pre><code class="language-python">import numpy as np
df.xxx = df.xxx.fillna(-1).astype(&#39;Int64&#39;).replace({-1: np.nan})</code></pre>
</blockquote>
<pre><code>
하지만 위의 방법으로 실수를 정수로 변환 할 수 없어서 다른 방법을 찾아 보던 중 `to_numeric()` 메서드를 발견했다.

`to_numeric()` 메서드는 판다스에서 제공하는 데이터 타입 변환 메서드로 오류에 대한 대처가 다양했다.
&gt;
&gt; ### to_numeric() 메서드 기본 문법
```sql
to_numeric(df.xxx, errors=raise, downcast=None)</code></pre><ul>
<li><strong>errors</strong><ul>
<li>raise(기본값): 오류를 발생시킵니다.</li>
<li>coerce: 변환할 수 없는 값을 NaN으로 변환합니다.</li>
<li>ignore: 변환할 수 없는 값을 그대로 유지합니다.<blockquote>
<br>

</blockquote>
나는 NULL 값을 유지한 채로 데이터 타입을 변환하고 싶어서 아래와 같이 코드를 작성해 보았다.<pre><code class="language-python">df.xxx = pd.to_numeric(df.xxx, errors=&#39;coerce&#39;).astype(&#39;Int64&#39;)</code></pre>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL 고득점 Kit] 주문량이 많은 아이스크림들 조회하기]]></title>
            <link>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%A3%BC%EB%AC%B8%EB%9F%89%EC%9D%B4-%EB%A7%8E%EC%9D%80-%EC%95%84%EC%9D%B4%EC%8A%A4%ED%81%AC%EB%A6%BC%EB%93%A4-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%A3%BC%EB%AC%B8%EB%9F%89%EC%9D%B4-%EB%A7%8E%EC%9D%80-%EC%95%84%EC%9D%B4%EC%8A%A4%ED%81%AC%EB%A6%BC%EB%93%A4-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 22 Mar 2024 08:25:01 GMT</pubDate>
            <description><![CDATA[<h1 id="❓-문제">❓ 문제</h1>
<p>7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회하는 SQL 문을 작성해주세요.</p>
<h1 id="❗️-문제-풀이">❗️ 문제 풀이</h1>
<blockquote>
<pre><code class="language-sql">/*</code></pre>
</blockquote>
<ol>
<li>상반기 주문 정보          FIRST_HALF</li>
<li>7월 아이스크림 주문 정보    JULY</li>
<li>7월에는 주문량이 많아 같은 아이스크림을 두 공장에서 출하하는 경우 발생 (출하 번호가 다름)</li>
<li>상반기 + 7월 아이스크림 총 주문량을 더한 값 중 상위 3개의 맛을 조회</li>
</ol>
<p>*/</p>
<blockquote>
</blockquote>
<p>with tb as (
    select *
    from FIRST_HALF
    union all
    select *
    from JULY
)</p>
<blockquote>
</blockquote>
<p>select FLAVOR
from tb
group by 1
order by sum(TOTAL_ORDER) desc
limit 3```</p>
<h1 id="📚-느낀점">📚 느낀점</h1>
<p>:)</p>
<br>

<hr>
<h1 id="🔗-reference">🔗 Reference</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/133027">https://school.programmers.co.kr/learn/courses/30/lessons/133027</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL 고득점 Kit] 연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기]]></title>
            <link>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%97%B0%EA%B0%84-%ED%8F%89%EA%B0%80%EC%A0%90%EC%88%98%EC%97%90-%ED%95%B4%EB%8B%B9%ED%95%98%EB%8A%94-%ED%8F%89%EA%B0%80-%EB%93%B1%EA%B8%89-%EB%B0%8F-%EC%84%B1%EA%B3%BC%EA%B8%88-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%97%B0%EA%B0%84-%ED%8F%89%EA%B0%80%EC%A0%90%EC%88%98%EC%97%90-%ED%95%B4%EB%8B%B9%ED%95%98%EB%8A%94-%ED%8F%89%EA%B0%80-%EB%93%B1%EA%B8%89-%EB%B0%8F-%EC%84%B1%EA%B3%BC%EA%B8%88-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 21 Mar 2024 22:14:08 GMT</pubDate>
            <description><![CDATA[<h1 id="❓-문제">❓ 문제</h1>
<p>HR_DEPARTMENT, HR_EMPLOYEES, HR_GRADE 테이블을 이용해 사원별 성과금 정보를 조회하려합니다. 평가 점수별 등급과 등급에 따른 성과금 정보가 아래와 같을 때, 사번, 성명, 평가 등급, 성과금을 조회하는 SQL문을 작성해주세요.</p>
<p>평가등급의 컬럼명은 GRADE로, 성과금의 컬럼명은 BONUS로 해주세요.
결과는 사번 기준으로 오름차순 정렬해주세요.</p>
<table>
<thead>
<tr>
<th><center>기준 점수</center></th>
<th><center>평가 등급</center></th>
<th><center>성과금(연봉 기준)</center></th>
</tr>
</thead>
<tbody><tr>
<td>96 이상</td>
<td>S</td>
<td>20%</td>
</tr>
<tr>
<td>90 이상</td>
<td>A</td>
<td>15%</td>
</tr>
<tr>
<td>80 이상</td>
<td>B</td>
<td>10%</td>
</tr>
<tr>
<td>이외</td>
<td>C</td>
<td>0%</td>
</tr>
</tbody></table>
<h1 id="❗️-문제-풀이">❗️ 문제 풀이</h1>
<blockquote>
<pre><code class="language-sql">select
    E.EMP_NO
    ,E.EMP_NAME
    ,case
        when avg(SCORE) &gt;= 96 then &#39;S&#39;
        when avg(SCORE) &gt;= 90 then &#39;A&#39; 
        when avg(SCORE) &gt;= 80 then &#39;B&#39; 
        else &#39;C&#39;
    end as GRADE
    ,case
        when avg(SCORE) &gt;= 96 then 0.2 * SAL
        when avg(SCORE) &gt;= 90 then 0.15 * SAL
        when avg(SCORE) &gt;= 80 then 0.1 * SAL
    else 0 * SAL
    end as BONUS
from HR_EMPLOYEES as E, HR_GRADE as G
where 1=1
    and E.EMP_NO = G.EMP_NO
group by 1</code></pre>
</blockquote>
<p>```</p>
<h1 id="📚-느낀점">📚 느낀점</h1>
<p>:)</p>
<br>

<hr>
<h1 id="🔗-reference">🔗 Reference</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/284528">https://school.programmers.co.kr/learn/courses/30/lessons/284528</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL 고득점 Kit] 언어별 개발자 분류하기]]></title>
            <link>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%96%B8%EC%96%B4%EB%B3%84-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%B6%84%EB%A5%98%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%96%B8%EC%96%B4%EB%B3%84-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%B6%84%EB%A5%98%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 21 Mar 2024 21:17:42 GMT</pubDate>
            <description><![CDATA[<h1 id="❓-문제">❓ 문제</h1>
<p>DEVELOPERS 테이블에서 GRADE별 개발자의 정보를 조회하려 합니다. GRADE는 다음과 같이 정해집니다.</p>
<ul>
<li>A : Front End 스킬과 Python 스킬을 함께 가지고 있는 개발자</li>
<li>B : C# 스킬을 가진 개발자</li>
<li>C : 그 외의 Front End 개발자</li>
</ul>
<p>GRADE가 존재하는 개발자의 GRADE, ID, EMAIL을 조회하는 SQL 문을 작성해 주세요.
결과는 GRADE와 ID를 기준으로 오름차순 정렬해 주세요.</p>
<h1 id="❗️-문제-풀이">❗️ 문제 풀이</h1>
<blockquote>
<pre><code class="language-sql">with tb as(
    select
        D.ID
        ,GROUP_CONCAT(S.NAME SEPARATOR &#39;_&#39;) as skill
        ,GROUP_CONCAT(S.CATEGORY SEPARATOR &#39;_&#39;) as skill_category
    from SKILLCODES as S, DEVELOPERS as D
    where S.CODE &amp; D.SKILL_CODE &gt; 0
    group by 1
    order by 1
)
</code></pre>
</blockquote>
<p>select
    distinct case
        when tb.skill like &#39;%Python%&#39; and tb.skill_category like &#39;%Front End%&#39; then &#39;A&#39;
        when tb.skill like &#39;%C#%&#39; then &#39;B&#39;
        when tb.skill_category like &#39;%Front End%&#39; then &#39;C&#39;
    end as GRADE
    ,D.ID
    ,D.EMAIL
from SKILLCODES as S, DEVELOPERS as D, tb
where 1=1
    and D.ID = tb.ID
HAVING 1=1
    and GRADE IS NOT NULL
order by 1, 2</p>
<p>```</p>
<h1 id="📚-배운점느낀점">📚 배운점/느낀점</h1>
<p>SKILLCODES 테이블의 경우 테스트 케이스에 따라 스킬 CODE 값이 달라지기 때문에 문제를 푸는데 있어 조금 고생했다. (스킬 CODE 값이 고정값인 줄 알았다...)</p>
<p>추가로 해당 문제를 풀면서 불가피하게 GROUP BY 절 없이 HAVING 절을 사용했다.
GROUP BY 절을 사용하면 데이터베이스가 먼저 그룹화하고 그 후에 조건(HAVING)을 적용할 수 있어서 필터링 작업을 최적화할 수 있다. 반면에 HAVING 절만 사용하는 경우에는 모든 행을 그룹화한 후에 조건(HAVING)을 적용하므로 성능에 영향을 줄 수 있다. 때문에 일반적으로 HAVING 절은 GROUP BY 절 뒤에 작성하는 것을 권장한다.</p>
<br>

<hr>
<h1 id="🔗-reference">🔗 Reference</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/276036">https://school.programmers.co.kr/learn/courses/30/lessons/276036</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL 고득점 Kit] 입양 시각 구하기(2)]]></title>
            <link>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%9E%85%EC%96%91-%EC%8B%9C%EA%B0%81-%EA%B5%AC%ED%95%98%EA%B8%B02</link>
            <guid>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%9E%85%EC%96%91-%EC%8B%9C%EA%B0%81-%EA%B5%AC%ED%95%98%EA%B8%B02</guid>
            <pubDate>Thu, 21 Mar 2024 20:40:10 GMT</pubDate>
            <description><![CDATA[<h1 id="❓-문제">❓ 문제</h1>
<p>보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. <strong>0시부터 23시까지, 각 시간대별로</strong> 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.</p>
<h1 id="❗️-문제-풀이">❗️ 문제 풀이</h1>
<blockquote>
<pre><code class="language-sql"></code></pre>
</blockquote>
<h1 id="0시--23시-정보를-가지고-있는-테이블">0시 ~ 23시 정보를 가지고 있는 테이블</h1>
<p>with recursive tb as (
    select 0 HOUR
    union all
    select HOUR + 1
    from tb
    where HOUR &lt; 23
)</p>
<blockquote>
</blockquote>
<p>select
    tb.HOUR as HOUR
    ,count(A.ANIMAL_ID) as COUNT
from tb left join ANIMAL_OUTS as A   # left join을 사용하여 모든 시간대(0~23시)를 출력
    on tb.HOUR = hour(A.DATETIME)
group by 1
order by 1</p>
<pre><code>
# 📚 배운점/느낀점
위 문제를 풀 때 &quot;_모든 시간이 출력될 수 있도록 0시~23시 데이터를 일일이 작성해야 하는 건가??_&quot; 라는 생각을 했다.

하지만, 아무리 생각해도 위 방법은 아닌 거 같아서 다른 방법을 찾아봤다.

찾아본 결과 재귀쿼리,계층커리 라고 불리는 `WITH RECURSIVE` 구문을 알게 되었다.

&gt;
사용법
```sql
with recursive &lt;가상 테이블명&gt; as (
    select n &lt;칼럼명&gt;     # 초기값 설정
    union all
    select &lt;칼럼명&gt; + m   # 초기값 이후 값 설정
    from &lt;가상 테이블명&gt;
    where ~
)</code></pre><br>

<hr>
<h1 id="🔗-reference">🔗 Reference</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/59413">https://school.programmers.co.kr/learn/courses/30/lessons/59413</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL 고득점 Kit] 년, 월, 성별 별 상품 구매 회원 수 구하기]]></title>
            <link>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EB%85%84-%EC%9B%94-%EC%84%B1%EB%B3%84-%EB%B3%84-%EC%83%81%ED%92%88-%EA%B5%AC%EB%A7%A4-%ED%9A%8C%EC%9B%90-%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EB%85%84-%EC%9B%94-%EC%84%B1%EB%B3%84-%EB%B3%84-%EC%83%81%ED%92%88-%EA%B5%AC%EB%A7%A4-%ED%9A%8C%EC%9B%90-%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 21 Mar 2024 20:15:34 GMT</pubDate>
            <description><![CDATA[<h1 id="❓-문제">❓ 문제</h1>
<p>USER_INFO 테이블과 ONLINE_SALE 테이블에서 년, 월, 성별 별로 <strong>상품을 구매한 회원수</strong>를 집계하는 SQL문을 작성해주세요. 결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 성별 정보가 없는 경우 결과에서 제외해주세요.</p>
<h1 id="❗️-문제-풀이">❗️ 문제 풀이</h1>
<blockquote>
<pre><code class="language-sql">/*
조건1 : 년, 월, 성별 별로 상품 그룹화 하여 회원수 집계
조건2 : 년, 월, 성별을 기준으로 오름차순
조건3 : 성별 정보가 없는 경우 제외
*/
</code></pre>
</blockquote>
<p>select 
    year(O.SALES_DATE) as YEAR
    ,month(O.SALES_DATE) as MONTH
    ,U.GENDER
    ,count(distinct U.USER_ID) as USERS   # 구매 횟수X, 구매 이력이 있는 회원수O 
from USER_INFO as U, ONLINE_SALE as O
where 1=1
    and U.USER_ID = O.USER_ID
    and U.GENDER is not null
group by 1, 2, 3
order by 1, 2, 3</p>
<p>```</p>
<br>

<hr>
<h1 id="🔗-reference">🔗 Reference</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/131532">https://school.programmers.co.kr/learn/courses/30/lessons/131532</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL 고득점 Kit] 식품분류별 가장 비싼 식품의 정보 조회하기]]></title>
            <link>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%8B%9D%ED%92%88%EB%B6%84%EB%A5%98%EB%B3%84-%EA%B0%80%EC%9E%A5-%EB%B9%84%EC%8B%BC-%EC%8B%9D%ED%92%88%EC%9D%98-%EC%A0%95%EB%B3%B4-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%8B%9D%ED%92%88%EB%B6%84%EB%A5%98%EB%B3%84-%EA%B0%80%EC%9E%A5-%EB%B9%84%EC%8B%BC-%EC%8B%9D%ED%92%88%EC%9D%98-%EC%A0%95%EB%B3%B4-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 20 Mar 2024 20:27:27 GMT</pubDate>
            <description><![CDATA[<h1 id="❓-문제">❓ 문제</h1>
<p>FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요. 이때 식품분류가 &#39;과자&#39;, &#39;국&#39;, &#39;김치&#39;, &#39;식용유&#39;인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬해주세요.</p>
<h1 id="❗️-문제-풀이">❗️ 문제 풀이</h1>
<blockquote>
<pre><code class="language-sql">/*
조건1 : 식품분류별 가격이 제일 비싼 식품
조건2 : 식품분류가 &#39;과자&#39;, &#39;국&#39;, &#39;김치&#39;, &#39;식용유&#39;인 경우만 출력
조건3 : 식품 가격을 기준으로 내림차순
*/
</code></pre>
</blockquote>
<h1 id="식품분류별-높은-가격-데이터-테이블">식품분류별 높은 가격 데이터 테이블</h1>
<p>with tb as (
    select
        CATEGORY
        ,max(PRICE) as MAX_PRICE
    from FOOD_PRODUCT
    where 1=1
        and CATEGORY in (&#39;과자&#39;, &#39;국&#39;, &#39;김치&#39;, &#39;식용유&#39;)
    group by 1
)</p>
<blockquote>
</blockquote>
<p>select
    F.CATEGORY
    ,F.PRICE as MAX_PRICE
    ,F.PRODUCT_NAME
from tb, FOOD_PRODUCT as F
where 1=1
    and tb.CATEGORY = F.CATEGORY
    and tb.MAX_PRICE = F.PRICE
order by 2 desc</p>
<pre><code>

# 📚 느낀점
문제를 풀 때 서브쿼리, JOIN 방법 등의 다양한 방법이 존재하는데,
나의 경우 필요한 정보를 담은 가상 테이블을 만든 다음 기존 테이블과 조인하는 방법을 선호한다. (개인적으로 위 방법이 가독성이 높다고 생각하기 때문...)

하지만, 위 방법이 좋은 방법인지 아직은 잘 모르겠다.

SQL의 성능적인 부분을 고려하여 코드를 작성하는 연습과 공부가 필요하다는 생각이 드는 문제였다.

&lt;br&gt;

---
# 🔗 Reference
https://school.programmers.co.kr/learn/courses/30/lessons/131116</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL 고득점 Kit] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기]]></title>
            <link>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%9E%90%EB%8F%99%EC%B0%A8-%EB%8C%80%EC%97%AC-%EA%B8%B0%EB%A1%9D%EC%97%90%EC%84%9C-%EB%8C%80%EC%97%AC%EC%A4%91-%EB%8C%80%EC%97%AC-%EA%B0%80%EB%8A%A5-%EC%97%AC%EB%B6%80-%EA%B5%AC%EB%B6%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%9E%90%EB%8F%99%EC%B0%A8-%EB%8C%80%EC%97%AC-%EA%B8%B0%EB%A1%9D%EC%97%90%EC%84%9C-%EB%8C%80%EC%97%AC%EC%A4%91-%EB%8C%80%EC%97%AC-%EA%B0%80%EB%8A%A5-%EC%97%AC%EB%B6%80-%EA%B5%AC%EB%B6%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 20 Mar 2024 19:10:30 GMT</pubDate>
            <description><![CDATA[<h1 id="❓-문제">❓ 문제</h1>
<p>CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 <strong>2022년 10월 16일</strong>에 대여 중인 자동차인 경우 &#39;대여중&#39; 이라고 표시하고, 대여 중이지 않은 자동차인 경우 &#39;대여 가능&#39;을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 &#39;대여중&#39;으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.</p>
<h1 id="❗️-문제-풀이">❗️ 문제 풀이</h1>
<blockquote>
<pre><code class="language-sql">/*
조건1 : 2022년 10월 16일 기준 대여 중인 차량은 &quot;대여중&quot;, 그렇지 않은 경우 &quot;대여 가능&quot;
조건2 : 반납 날짜가 2022년 10월 16일인 경우 &quot;대여중&quot;으로 표기
조건3 : 자동차ID 내림차순
*/
</code></pre>
</blockquote>
<p>select
    CAR_ID
    ,if(date_format(max(END_DATE), &#39;%Y-%m-%d&#39;) &lt; &#39;2022-10-16&#39;
        ,&#39;대여 가능&#39;
        ,&#39;대여중&#39;
       )as AVAILABILITY
from CAR_RENTAL_COMPANY_RENTAL_HISTORY 
where 1=1
    and date_format(START_DATE, &#39;%Y-%m-%d&#39;) &lt;= &#39;2022-10-16&#39;
group by 1
order by 1 desc</p>
<pre><code>이 문제를 풀 때 `where`문에 START_DATE 값을 &#39;2022-10-16&#39; 이전값으로 조건 거는 것이 중요 포인트라 생각된다.
&gt;

# 📚 느낀점
문제를 풀 때 IF문과 CASE문을 고민했는데, 사용 편의상 IF문을 활용하여 문제를 풀었다.
하지만, 성능적인 부분을 고려하면 어느 조건문이 좋을지 궁금했다.

구긍링 + ChatGPT에 물어본 결과 큰 차이는 없다는 정보를 알게 되었다.


&lt;br&gt;

---
# 🔗 Reference
https://school.programmers.co.kr/learn/courses/30/lessons/157340</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL 고득점 Kit] 카테고리 별 도서 판매량 집계하기]]></title>
            <link>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%B9%B4%ED%85%8C%EA%B3%A0%EB%A6%AC-%EB%B3%84-%EB%8F%84%EC%84%9C-%ED%8C%90%EB%A7%A4%EB%9F%89-%EC%A7%91%EA%B3%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%B9%B4%ED%85%8C%EA%B3%A0%EB%A6%AC-%EB%B3%84-%EB%8F%84%EC%84%9C-%ED%8C%90%EB%A7%A4%EB%9F%89-%EC%A7%91%EA%B3%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 20 Mar 2024 18:28:24 GMT</pubDate>
            <description><![CDATA[<h1 id="❓-문제">❓ 문제</h1>
<p>2022년 1월의 카테고리 별 도서 판매량을 합산하고, 카테고리(CATEGORY), 총 판매량(TOTAL_SALES) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 카테고리명을 기준으로 오름차순 정렬해주세요.</p>
<h1 id="❗️-문제-풀이">❗️ 문제 풀이</h1>
<blockquote>
<pre><code class="language-sql">/*
조건1 : 2022년 1월 기준
조건2 : 카테고리 별 도서 판매량 합산
조건3 : 카테고리명 오름차순
*/
</code></pre>
</blockquote>
<p>select
    B.CATEGORY
    ,sum(S.SALES) as TOTAL_SALES
from BOOK as B, BOOK_SALES as S
where 1=1
    and B.BOOK_ID = S.BOOK_ID
    and date_format(S.SALES_DATE, &#39;%Y-%m&#39;) = &#39;2022-01&#39;
group by 1
order by 1</p>
<p>```</p>
<br>

<hr>
<h1 id="🔗-reference">🔗 Reference</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/144855">https://school.programmers.co.kr/learn/courses/30/lessons/144855</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL 고득점 Kit] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기]]></title>
            <link>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EB%8C%80%EC%97%AC-%ED%9A%9F%EC%88%98%EA%B0%80-%EB%A7%8E%EC%9D%80-%EC%9E%90%EB%8F%99%EC%B0%A8%EB%93%A4%EC%9D%98-%EC%9B%94%EB%B3%84-%EB%8C%80%EC%97%AC-%ED%9A%9F%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EB%8C%80%EC%97%AC-%ED%9A%9F%EC%88%98%EA%B0%80-%EB%A7%8E%EC%9D%80-%EC%9E%90%EB%8F%99%EC%B0%A8%EB%93%A4%EC%9D%98-%EC%9B%94%EB%B3%84-%EB%8C%80%EC%97%AC-%ED%9A%9F%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 20 Mar 2024 18:26:02 GMT</pubDate>
            <description><![CDATA[<h1 id="❓-문제">❓ 문제</h1>
<p>CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 <strong>2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상</strong>인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.</p>
<h1 id="❗️-문제-풀이">❗️ 문제 풀이</h1>
<blockquote>
<h3 id="1차-풀이">1차 풀이</h3>
</blockquote>
<pre><code class="language-sql">select
    month(START_DATE) as MONTH
    ,CAR_ID
    ,count(HISTORY_ID) as RECORDS
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
where 1=1
    and date_format(START_DATE, &#39;%Y-%m&#39;) between &#39;2022-08&#39; and &#39;2022-10&#39;
group by 1, 2
having count(HISTORY_ID) &gt;= 5
order by 1, 2 desc</code></pre>
<p>코드 실행 결과 <strong>&quot;틀렸습니다!&quot;</strong> 라는 문구를 받았다 ㅎㅎ...</p>
<p>문제를 곰곰이 다시 읽고 왜 틀린 이유를 파악했다.</p>
<p>문제에서는 8~10월 동안 총대여 횟수가 5회 이상인 자동차를 조회하는 것이었지만,
내가 풀이한 방식은 매달(8월, 9월, 10월) 대여 횟수가 5회 이상인 자동차를 조회한 것이었다.
(즉, <code>8월 대여 + 9월 대여 + 10월 대여 &gt; = 5대 대여</code>)</p>
<blockquote>
<h3 id="2차-풀이">2차 풀이</h3>
</blockquote>
<pre><code class="language-sql">/*
조건1 : 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차
조건2 : 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬
조건3 : 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외
*/
&gt;
# 8월~10월 동안 차량별 대여 횟수가 5회 이상인 데이터 테이블 
with tb as (
    select 
        CAR_ID
        ,count(HISTORY_ID) as RECORDS
    from CAR_RENTAL_COMPANY_RENTAL_HISTORY 
    where 1=1
        and date_format(START_DATE, &#39;%Y-%m&#39;) between &#39;2022-08&#39; and &#39;2022-10&#39;
    group by 1
    having count(HISTORY_ID) &gt;= 5
)
&gt;
# 위 테이블을 활용하여 결과 추출
select 
     month(C.START_DATE) as MONTH
    ,C.CAR_ID
    ,count(C.HISTORY_ID) as RECORDS
from tb, CAR_RENTAL_COMPANY_RENTAL_HISTORY as C
where 1=1 
    and tb.CAR_ID = C.CAR_ID   # 8월~10월 동안 차량별 대여 횟수가 5회 이상 차량ID 정보만을 JOIN
    and date_format(C.START_DATE, &#39;%Y-%m&#39;) between &#39;2022-08&#39; and &#39;2022-10&#39;
group by 1, 2
order by 1, 2 desc</code></pre>
<br>

<hr>
<h1 id="🔗-reference">🔗 Reference</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/151139">https://school.programmers.co.kr/learn/courses/30/lessons/151139</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL 고득점 Kit] 저자 별 카테고리 별 매출액 집계하기]]></title>
            <link>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%A0%80%EC%9E%90-%EB%B3%84-%EC%B9%B4%ED%85%8C%EA%B3%A0%EB%A6%AC-%EB%B3%84-%EB%A7%A4%EC%B6%9C%EC%95%A1-%EC%A7%91%EA%B3%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%A0%80%EC%9E%90-%EB%B3%84-%EC%B9%B4%ED%85%8C%EA%B3%A0%EB%A6%AC-%EB%B3%84-%EB%A7%A4%EC%B6%9C%EC%95%A1-%EC%A7%91%EA%B3%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 19 Mar 2024 19:28:05 GMT</pubDate>
            <description><![CDATA[<h1 id="❓-문제">❓ 문제</h1>
<p>2022년 1월의 도서 판매 데이터를 기준으로 저자 별, 카테고리 별 매출액(TOTAL_SALES = 판매량 * 판매가) 을 구하여, 저자 ID(AUTHOR_ID), 저자명(AUTHOR_NAME), 카테고리(CATEGORY), 매출액(SALES) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 저자 ID를 오름차순으로, 저자 ID가 같다면 카테고리를 내림차순 정렬해주세요.</p>
<h1 id="❗️-문제-풀이">❗️ 문제 풀이</h1>
<blockquote>
<pre><code class="language-sql">/*
도서 정보         BOOK
저자 정보         AUTHOR
도서 판매 정보     BOOK_SALES
</code></pre>
</blockquote>
<p>도서 판매 데이터를 기준으로 저자별, 카테고리별 매출액(총합 매출액), 저자ID, 저자명, 카테고리, 매출액 출력</p>
<blockquote>
</blockquote>
<p>조건1: 2022년 1월 판매 도서
조건2: 저자 ID 오름차순, 카테고리 내림차순
*/</p>
<blockquote>
</blockquote>
<p>select
    BOOK.AUTHOR_ID        # 저자ID
    ,AUTHOR.AUTHOR_NAME   # 저자명
    ,BOOK.CATEGORY        # 카테고리
    ,sum(BOOK.PRICE * BOOK_SALES.SALES) as TOTAL_SALES  # 총합 매출액
from BOOK, AUTHOR, BOOK_SALES 
where 1=1
    and BOOK.AUTHOR_ID = AUTHOR.AUTHOR_ID   # self join
    and BOOK.BOOK_ID = BOOK_SALES.BOOK_ID
    and date_format(SALES_DATE, &#39;%Y-%m&#39;) = &#39;2022-01&#39;
group by 2, 3             # 저자 별, 카테고리 별 그룹화
order by 1, 3 desc        # 저자ID 오름차순, 카테고리 내림차순</p>
<p>```</p>
<h1 id="📚-느낀점">📚 느낀점</h1>
<p>:)
<br></p>
<hr>
<h1 id="🔗-reference">🔗 Reference</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/parts/17044">https://school.programmers.co.kr/learn/courses/30/parts/17044</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL 고득점 Kit] 조건에 맞는 사용자와 총 거래금액 조회하기]]></title>
            <link>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%A1%B0%EA%B1%B4%EC%97%90-%EB%A7%9E%EB%8A%94-%EC%82%AC%EC%9A%A9%EC%9E%90%EC%99%80-%EC%B4%9D-%EA%B1%B0%EB%9E%98%EA%B8%88%EC%95%A1-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%A1%B0%EA%B1%B4%EC%97%90-%EB%A7%9E%EB%8A%94-%EC%82%AC%EC%9A%A9%EC%9E%90%EC%99%80-%EC%B4%9D-%EA%B1%B0%EB%9E%98%EA%B8%88%EC%95%A1-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 18 Mar 2024 18:28:17 GMT</pubDate>
            <description><![CDATA[<h1 id="❓-문제">❓ 문제</h1>
<p>USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서 완료된 중고 거래의 총금액이 70만 원 이상인 사람의 회원 ID, 닉네임, 총거래금액을 조회하는 SQL문을 작성해주세요. 결과는 총거래금액을 기준으로 오름차순 정렬해주세요.</p>
<h1 id="❗️-문제-풀이">❗️ 문제 풀이</h1>
<blockquote>
<pre><code class="language-sql">/*
USED_GOODS_BOARD    게시판 정보 
USED_GOODS_USER     사용자 정보
조건1. 완료된 중고 거래
조건2. 총금액 70만 이상
조건3. 총거래금액 기준 오름차순
*/
select
    U.USER_ID
    ,U.NICKNAME
    ,sum(B.PRICE) as TOTAL_SALES
from USED_GOODS_BOARD as B, USED_GOODS_USER as U
where 1=1
    and B.WRITER_ID = U.USER_ID
    and B.STATUS = &#39;DONE&#39;
group by U.USER_ID
having sum(B.PRICE) &gt;= 700000
order by 3</code></pre>
</blockquote>
<p>```</p>
<h1 id="📚-느낀점">📚 느낀점</h1>
<p>문제를 꼼꼼하게 읽자!!!
&quot;완료된 중고 거래&quot; 조건을 확인하지 못해서 10분 정도 고생했다 ㅎㅎ..
:)</p>
<br>

<hr>
<h1 id="🔗-reference">🔗 Reference</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/164668">https://school.programmers.co.kr/learn/courses/30/lessons/164668</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL 고득점 Kit] 월별 잡은 물고기 수 구하기]]></title>
            <link>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%9B%94%EB%B3%84-%EC%9E%A1%EC%9D%80-%EB%AC%BC%EA%B3%A0%EA%B8%B0-%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EC%9B%94%EB%B3%84-%EC%9E%A1%EC%9D%80-%EB%AC%BC%EA%B3%A0%EA%B8%B0-%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 18 Mar 2024 18:11:42 GMT</pubDate>
            <description><![CDATA[<h1 id="❓-문제">❓ 문제</h1>
<p>월별 잡은 물고기의 수와 월을 출력하는 SQL문을 작성해주세요.</p>
<p>잡은 물고기 수 컬럼명은 FISH_COUNT, 월 컬럼명은 MONTH로 해주세요.
결과는 월을 기준으로 오름차순 정렬해주세요.
단, 월은 숫자형태 (1~12) 로 출력하며 9 이하의 숫자는 두 자리로 출력하지 않습니다. 잡은 물고기가 없는 월은 출력하지 않습니다.</p>
<h1 id="❗️-문제-풀이">❗️ 문제 풀이</h1>
<blockquote>
<pre><code class="language-sql">select 
    count(date_format(TIME, &#39;%c&#39;)) as FISH_COUNT,
    cast(date_format(TIME, &#39;%c&#39;) as unsigned) as MONTH
from FISH_INFO
group by 2
order by 2</code></pre>
</blockquote>
<p>```
cast() 함수를 사용하여 문자 타입의 데이터를 숫자 타입으로 변경한 뒤 정렬해 보았다.</p>
<h1 id="📚-느낀점">📚 느낀점</h1>
<p>:)</p>
<br>

<hr>
<h1 id="🔗-reference">🔗 Reference</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/293260">https://school.programmers.co.kr/learn/courses/30/lessons/293260</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL 고득점 Kit] 노선별 평균 역 사이 거리 조회하기]]></title>
            <link>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EB%85%B8%EC%84%A0%EB%B3%84-%ED%8F%89%EA%B7%A0-%EC%97%AD-%EC%82%AC%EC%9D%B4-%EA%B1%B0%EB%A6%AC-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@shin-ms/SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-%EB%85%B8%EC%84%A0%EB%B3%84-%ED%8F%89%EA%B7%A0-%EC%97%AD-%EC%82%AC%EC%9D%B4-%EA%B1%B0%EB%A6%AC-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 18 Mar 2024 17:59:06 GMT</pubDate>
            <description><![CDATA[<h1 id="❓-문제">❓ 문제</h1>
<p>SUBWAY_DISTANCE 테이블에서 노선별로 노선, 총 누계 거리, 평균 역 사이 거리를 노선별로 조회하는 SQL문을 작성해주세요.</p>
<p>총 누계거리는 테이블 내 존재하는 역들의 역 사이 거리의 총 합을 뜻합니다. 총 누계 거리와 평균 역 사이 거리의 컬럼명은 각각 TOTAL_DISTANCE, AVERAGE_DISTANCE로 해주시고, 총 누계거리는 소수 둘째자리에서, 평균 역 사이 거리는 소수 셋째 자리에서 반올림 한 뒤 단위(km)를 함께 출력해주세요.
결과는 총 누계 거리를 기준으로 내림차순 정렬해주세요.</p>
<h1 id="❗️-문제-풀이">❗️ 문제 풀이</h1>
<blockquote>
<pre><code class="language-sql">/*
TOTAL_DISTANCE     총 누계 거리(역 사이 거리의 총합)
AVERAGE_DISTANCE   평균 역 사이 거리
*/
select
    ROUTE
    ,concat(round(sum(D_BETWEEN_DIST), 1), &#39;km&#39;) as TOTAL_DISTANCE
    ,concat(round(avg(D_BETWEEN_DIST), 2), &#39;km&#39;) as AVERAGE_DISTANCE
from SUBWAY_DISTANCE
group by ROUTE
order by round(sum(D_BETWEEN_DIST), 1) desc;</code></pre>
</blockquote>
<p>```</p>
<h1 id="📚-느낀점">📚 느낀점</h1>
<p>concat()함수에 의해 값이 문자열로 변하였기 때문에 정렬 할 때는 숫자 타입의 값만을 추출하여 정렬해야 한다.</p>
<p>디테일한 부분 까지 신경 쓰자!! 
:)</p>
<br>

<hr>
<h1 id="🔗-reference">🔗 Reference</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/284531">https://school.programmers.co.kr/learn/courses/30/lessons/284531</a></p>
]]></description>
        </item>
    </channel>
</rss>