지난 글에서 DBeaver에 GPT를 연동하는 방법을 살펴봤습니다.
https://sweetquant.tistory.com/557
간단한 SQL은 잘 작성합니다. 조금(?) 복잡한 SQL을 GPT로 시도해봤습니다.
우선, DBeaver에 연동해서 API 형태로 GPT를 사용하는 것은 실제 OpenAI에 접속해 GPT와 채팅하면서 답변을 얻는 것과는 차이가 있어 보입니다. 아무래도 GPT와 채팅하면서 얻는 답변이 좀 더 품질이 좋아보입니다.
테스트한 결과를 살펴보겠습니다.
먼저, 매장 테이블과 주문 테이블을 조인하는 간단한 SQL을 요청했습니다.
SQL에 성능 문제가 발생되도록 작성되었습니다. OrdDtm 컬럼을 DATE_FORMAT으로 가공해 인덱스가 있어도 사용을 못하도록 SQL이 만들어졌습니다. 그리고 아래 SQL의 프롬프트는 제 실수가 있었습니다. 사실 매장등급이란 컬럼은 없습니다. 없으면 없다고 메시지를 주면 좋은데, 그러지는 않네요. 자신이 생각할때 적절하다고 생각한 컬럼을 사용해 결과를 만들어 냅니다.
-- 프롬프트: 매장 테이블과 주문 테이블을 조인해서 보여줘,
-- 주문일시가 2022년 12월이고, 매장등급이 플래티넘(PLAT)인 데이터만 조회해줘
SELECT *
FROM shop s
JOIN ord o ON s.ShopId = o.ShopId
WHERE DATE_FORMAT(o.OrdDtm, '%Y%m') = '202212' AND s.ShopSt = 'PLAT';
이번에는 성능을 고려하라고 프롬프트를 추가하고, 매장이 아닌 회원과 조인을 요청합니다. 이번 SQL은 100점입니다. 인덱스 사용을 고려해달라고 요청하니 OrdDtm에 적절하게 조건 처리를 했습니다. 물론, OrdDtm에 인덱스는 아직 없지만요.
-- 프롬프트
-- 회원 테이블과 주문 테이블을 조인해서 보여줘,
-- 주문일시가 2022년 12월이고, 회원등급이 플래티넘(PLAT)인 데이터만 조회해줘.
-- 성능을 고려해서 SQL을 작성해줘. 인덱스를 사용할 수 있게 SQL을 작성해야 한다는 거지.
-- Sure, here is the SQL query that joins the `member` and `ord` tables, and filters for orders made in December 2022 by members with a 'PLAT' grade. This query is optimized for performance by using the appropriate indexes.
/*
This query joins the member and ord tables on the MemberId field.
It then filters for orders made in December 2022 and by members with a 'PLAT' grade.
The WHERE clause is written in a way that allows the use of indexes for performance optimization.
*/
SELECT m.*, o.*
FROM `member` AS m
INNER JOIN ord AS o ON m.MemberId = o.MemberId
WHERE m.MemberGd = 'PLAT'
AND o.OrdDtm >= '2022-12-01 00:00:00'
AND o.OrdDtm < '2023-01-01 00:00:00';
-- Please note that the date format and the 'PLAT' value are just examples and should be replaced with the actual format and value used in your database. Also, make sure that there are indexes on the `MemberId`, `MemberGd`, and `OrdDtm` fields for optimal performance.
조금 수준을 올려봅니다. StartUP SQL에서 사용하는 퀴즈를 활용해봅니다. https://sweetquant.tistory.com/542 의 마지막에 있는 16-4번 문제입니다. 그러나 여전히 성능 관점에서는 빵점 SQL이네요.
문제:
-- [BOOSTER QUIZ 16-4] 가입년도별, 회원상태별 2023년 1월의 주문 건수를 구하시오.
-- 특정 가입년도별, 회원상태별 주문이 없어도 0건으로 집계해서 출력해주세요. 그리고 가입년도별 주문건수와 전체 주문건수도 추가해서 보여주세요.
-- - 대상 테이블: 회원(Member), 주문(Ord)
-- - 조회 조건: OrdDtm이 2023년 1월인 주문 데이터
-- - 조회 컬럼: JoinYear, MemberSt, OrdCnt
-- - 추가 조건:
-- : 성능을 고민하고 인덱스를 사용할 수 있도록 SQL을 작성할것.
-- : JoinYear는 JoinDtm을 년도로 변환한 값
-- : JoinYear별, MemberSt별 GROUP BY 처리하시오.
-- : OrdCnt는 JoinYear, MemberSt별 주문 건수
-- : Member와 Ord를 아우터 조인해 주문이 없는 JoinYear, MemberSt도 주문 건수가 0건으로 출력되도록 하시오.
-- : ROLLUP을 사용해 JoinYear별 중간합계와 전체합계를 추가하시오.
DBeaver+GPT 답변:
SELECT
YEAR(m.JoinDtm) AS JoinYear,
m.MemberSt,
COUNT(o.OrdNo) AS OrdCnt
FROM
`member` m
LEFT JOIN
ord o ON m.MemberId = o.MemberId AND YEAR(o.OrdDtm) = 2023 AND MONTH(o.OrdDtm) = 1
GROUP BY
YEAR(m.JoinDtm), m.MemberSt WITH ROLLUP;
조금 더 수준을 올려봅니다. 세개 테이블 조인과 분석함수까지 사용해야 하는 SQL입니다.
(문제 출처: https://sweetquant.tistory.com/548 )
휴~ 다행이네요. 아래 SQL은 에러가 발생합니다. SELECT 절에서 ItemId 컬럼을 사용할때 테이블이 지정되지 않았기 때문이죠.
-- [BOOSTER QUIZ 20-2] 2022년 11월 2022년 12월 주문에 대해, 주문년월별 상품별 주문수량을 구해주세요, 주문년월별로 주문수량에 따른 순위를 구해주세요.
-- - 대상 테이블: 주문(Ord), 주문상세(OrdDet), 상품(Item)
-- - 조회 조건: OrdDtm이 2022년 11월부터 2022년 12월 말까지인 데이터
-- - 조회 컬럼: OrdYm, ItemId, ItemNm, SumOrdQty, RankOverByYm
-- - 추가 조건:
-- : OrdYm, ItemId별 GROUP BY 처리하시오.
-- : OrdYm은 OrdDtm을 DATE_FORMAT으로 년월 형태로 변환한 값입니다.
-- : SumOrdQty는 OrdYm, ItemId별 SUM한 OrdQty 값입니다.
-- : RankOverByYm은 ItemId의 판매수량(SumOrdQty)에 대한 순위입니다. 이 순위는 년월별로 구해야 하며 판매 수량이 높으면 1이 됩니다.
SELECT
DATE_FORMAT(OrdDtm, '%Y%m') AS OrdYm,
ItemId,
ItemNm,
SUM(OrdQty) AS SumOrdQty,
RANK() OVER (PARTITION BY DATE_FORMAT(OrdDtm, '%Y%m') ORDER BY SUM(OrdQty) DESC) AS RankOverByYm
FROM
ord
JOIN
orddet ON ord.OrdNo = orddet.OrdNo
JOIN
item ON orddet.ItemId = item.ItemId
WHERE
OrdDtm BETWEEN '2022-11-01' AND '2022-12-31'
GROUP BY
DATE_FORMAT(OrdDtm, '%Y%m'),
ItemId,
ItemNm
ORDER BY
OrdYm,
RankOverByYm;-- This query will return the total quantity of each item ordered per month for November and December 2022, along with a rank for each item based on the quantity ordered. The rank is calculated separately for each month.
DBeaver에 GPT API를 연동해 다양한 SQL을 시도해봤습니다.
아직은 API 연동으로 복잡한 SQL을 작성하는 데는 한계가 있어 보입니다.
(GPT와 직접 채팅으로 시도해보면 좀 더 결과가 잘나오지 않을까 싶네요.)
그러나 책으로만 SQL을 배운 신입보다는 낫다고도 할 수 있습니다.
지금은 AI를 활용한 SQL 작성에 한계는 있어보이지만,
개인적으로는 언젠가 이 한계를 극복할 것이라고 생각합니다.
다만, GPT가 잘할거라고 해서 우리가 공부를 게을리 해도 된다는 것은 아닙니다.
오히려 이전보다 더 깊이있게 공부할 필요가 있다고 생각합니다.
우리가 잘 알아야 잘 시킬 수 있으니까요..
언젠가는 시킬 일 조차 없게 될지도 모르지만, 그때는 그때고요.
오늘은 노력해야 하지 않을까요?
바짝 긴장해라. H.U.M.A.N!
[StartUP Tuning]
SQL 입문을 넘어선 MySQL을 활용한 SQL 튜닝 입문 교육
2024년 5월 주말 오프라인 교육 과정 모집중: https://cafe.naver.com/dbian/7717
[StartUP SQL]
데이터 분석가, 개발자, 기획자를 위한 SQL 입문 교육
교육용 슬라이드 전체 무료 오픈: https://sweetquant.tistory.com/497
'데이터분석 > Data Analysis With GPT' 카테고리의 다른 글
자동완성을 뛰어넘는 Copilot (0) | 2024.05.09 |
---|---|
선만 추가했을 뿐인데 OK가 된 리포트 (1) | 2024.05.08 |
DBeaver에 GPT 연동하기 (1) | 2024.05.01 |
GPT를 활용한 용어 결정: StockCode?Ticker?Symbol? (1) | 2023.12.27 |
GPT로 댓글봇 만들기 (0) | 2023.12.27 |
GPT의 놀라운 통찰력: GPT가 제안한 중국 관광객 마케팅 전략 (2) | 2023.12.26 |
AI 시대에 가져야 할 우리의 자세 (1) | 2023.12.24 |
GPT랑 쿵짝해서 주요 ETF 들을 한눈에 볼 수 있게 만들어봤습니다. (0) | 2023.11.03 |