SQL

250731_SQL(row_number -고유랭킹 문제)

baektree 2025. 8. 1. 20:54

요약/나만의 인사이트

 태블로 매개변수-계산식 사용해서 전년비 매출 구하기

  1. P_년도를 통해 매개변수 생성 2021 ~ 2024
  2. C_금년 매출 계산식 생성 IF YEAR([주문 일자]) = [P_년도] THEN [매출] END
  3. C_전년 매출 계산식생성 IF YEAR([주문 일자]) = [P_년도]-1 THEN [매출] END
  4. C_전년비 매출 계산식 생성 (SUM([C_금년 매출]) - SUM([C_전년 매출])) / SUM([C_전년 매출])
  5. C_전년비 매출 양/음 계산식 생성 - 색상표시 목적
    IF [C_전년비 매출] ≥ 0 THEN [C_전년비 매출] END
    IF [C_전년비 매출] < 0 THEN [C_전년비 매출] END

새롭게 알게 된 것

태블로

태블로 LOD(Level Of Detail) 표현식

  • 시각화의 집계 수준과 관계없이 원하는 수준의 집계를 정의할 수 있도록 하는 기능.
  • 태블로는 기본적으로 차원에 따라 집계를 수행하는데, LOD 표현식을 사용하면 임의의 수준으로 제어할 수 있다.
  • e.g. 뷰 기준은 시군구이나 / 집계는 시도를 기준으로 매출을 보고 싶을 때
  • e.g. 고객들의 첫 구매 일자를 보고 싶을 때

 

데이터 결합

 
논리적 계층 (Logical Layer)
물리적 계층 (Physical Layer)
개념
• 데이터 모델의 상위 레이어 • 각 테이블을 하나의 논리적 테이블로 유지한 상태에서 결합 • 테이블 간 결합은 관계(Relationship)를 사용 • 실제 쿼리는 뷰에서 필드가 사용될 때 동적으로 생성 (지연 조인)
• 데이터 모델의 하위 레이어 • 실제 데이터베이스 수준에서 테이블을 결합하여 하나의 물리적 테이블 생성 • 테이블 간 결합은 조인(Join) 또는 유니온(Union) 사용 • 결합 시점에 이미 데이터가 합쳐져 이후 분석에서는 단일 테이블로 처리됨
특징
집계 수준(Level of Detail) 보존: 서로 다른 LOD의 테이블을 자연스럽게 결합 • 중복 데이터 최소화: 불필요한 조인 방지 • 성능 최적화: 필요한 시점에만 쿼리 실행 • 유연한 모델링: 동일 모델에서 다양한 분석 시나리오 지원
결합 시 즉시 조인 실행: 결합된 데이터는 하나의 테이블로 간주 • 집계 수준 통일 필요: 서로 다른 LOD 데이터를 결합하면 중복/Null 가능 • 전통적인 SQL Join과 동일한 개념 데이터 용량 커질 수 있음: 조인 방식(Inner, Left, Right)에 따라 성능 영향
방법(Method)
설명(Description)
생성 위치(Where created)
관계 (Relationship)
여러 테이블의 필드/컬럼을 사용할 수 있는 기능을 설정합니다.
캔버스의 논리 계층(Logical layer)
조인 (Join)
필드/컬럼을 추가하여 여러 테이블을 물리적으로 결합합니다.
캔버스의 물리 계층(Physical layer)
유니온 (Union)
여러 테이블을 행(Row) 단위로 물리적으로 결합합니다.
캔버스의 물리 계층(Physical layer)
블렌드 (Blend)
기본(primary) 및 보조(secondary) 데이터 소스의 필드/컬럼을 연결 필드로 사용하도록 설정합니다.
워크북 내 시트(Worksheet) (ex 이번년도 매출이 목표 매출을 달성했는가?)
 

 

대시보드 만들기 위해 고려해야 할 것들

  1. 대시보드 보는 사람은 누구인가?
  2. 대시보드 보는 시점은 언제인가? (EX 업무 보고, 모니터링, 미팅)
  3. 보는 사람의 상태는 어떠한가? (EX 집중, 피곤)
  4. 보는 주기가 어떠한가? (EX 매일, 주간 등)
  5. 누구랑 보는가? (EX 대표, 협력업체 등)
  6. 공유할 수 있는 데이터와 공유할 수 없는 데이터?

대시보드 종류

  • 전략 대시보드 - 전체적인 수치들을 축약해서 보여줌
  • 분석 대시보드 - 드릴다운(필터링) 분석, (e.g. 수익 문제 → 고객, 상품 관점 → 드릴다운 → 분석용)
  • 운영 대시보드 - 지속적으로 모니터링 해야 하는 대시보드 (실시간 데이터 수집)

 

대시보드 만들기 순서

1. 비즈니스 퀘스천 던지기

이 대시보드를 통해서 어떤 걸 확인할거지? 내가 만드는 목적은?

2. 화면 설계
3. 표현방식 결정
4. 차트 결정
5. 액션 설계 (마우스 오버, 동작)

 

대시보드 만들 때 주의사항

  • 대시보드 시트는 6개를 넘지 말자 (why 기억하기 쉽지 않다.)
  • 시각정보가 유사한 것끼리 근접하게
  • 고객관련 영역, 제품관련 영역 등 일관된 정도들끼리 묶기
  • 정렬/여백/색상 3~4개/폰트

특히 어려웠던 것

SQL ROW_NUMBER() OVER() 문제

  • 동일점수 일지라도 고유 순위 부여, 이때 이름 오름차순 등 순위 매기는 세부사항 설정 가능
  • 문제 회사에는 직원 정보가 담긴 테이블 employees가 있습니다. 각 부서(department)별로 연봉(salary)이 가장 높은 직원 2명씩을 추출하는 SQL 쿼리를 작성하세요. 동일 부서 내 연봉이 같을 경우, employee_id 오름차순으로 우선순위를 결정합니다.

조건 정리:

  • ROW_NUMBER() 윈도우 함수를 반드시 사용할 것.
  • 부서별 상위 2명만 추출.
  • 연봉이 같을 때는 employee_id가 낮은 사람이 우선.
  • 결과에는 employee_id, name, department, salary가 포함되어야 함.
  • 풀이
    1. 순위를 생성하는 컬럼 추가
    2. 서브 테이블로 묶음
    3. 메인 쿼리에서 랭킹이 2순위 이내만 필터링
    4. 거기서 결과에 표시되어야 하는 컬럼만 조회
SELECT employee_id, name, department, salary
FROM ( 
	SELECT *, 
				ROW_NUMBER() OVER(PARTITION BY department ORDER BY salary DESC, employee_id ASC) as rnk
	FROM employees 
) sub
WHERE rnk <= 2;
							

다음에 적용해 볼 것

  • 대시보드 기획 시 참고 → 자연어 기반 대시보드 기획가능

https://lovable.dev/