archive
22
2019-01-10 15:32:23 작성 2019-01-10 17:16:53 수정됨
2
413

[SQL문 작성] 도움을 구합니다. 그룹별 최대 값을 찾고, 다른 테이블과 조인하려 합니다.


환경

MSSQL, Mybatis 를 사용하고 있습니다.


개요

B 테이블에서

한 칼럼의 값을 기준으로 그룹을 지어

각 그룹별 가장 가장 최근 튜플들을 검색한 뷰를

테이블과 조인하려 합니다.

SQL 문을 어떻게 작성해야할까요?


상태

문제는 다음과 같습니다.


두 테이블이 있습니다.

  • A
  • B


두 테이블은 하나의 값을 공유하고 있습니다.

  • A.id = B.id


A 테이블

  • id에 대한 기본 정보를 다루고 있습니다.
  • id컬럼은 테이블 내에서 중복되지 않는 유일한 값입니다.


B 테이블

  • A에서 언급된 각 id의 변화에 대한 시점별 로그를 다루고 있습니다.
  • id 컬럼은 테이블 내에서 중복되는 값입니다.


다음과 같은 결과를 Select 하려고 합니다.

select
cast(A.name_korean as varchar(1000)) as name_korean,
cast(A.name_english as varchar(1000)) as name_english,
A.data1 as data1,
A.data2 as data2,
A.id as id,
A.type as type,
(case
when (B.a = 'On' and B.b = 'On' and B.c = 'On' and B.d = 'On') then 'On'
else 'off'
end) as status


B 테이블에서

각 id의 가장 최근 튜플들을 검색하여

A 테이블과 조인하려 합니다.

아래는 제가 잘 알지 못하여 잘못된 문법으로 작성한 구문입니다.

from
A,
(select B.id, max(B.date) as date
from B
group by B.id) as B


기타

구글링을 통해 찾은 방법은

먼저 B 테이블을 내림차순으로 정렬 한 후 각 소그룹의 첫번째 행을 가져오는 것입니다.

하지만 이 방법은 데이터가 점점 늘어날수록

정렬이라는 오버헤드가 점점 무거워질것 같아서

다른 방법을 찾고 있습니다.


0
0
  • 답변 2

  • 무언가
    98
    2019-01-10 17:08:49

    row_number() over(patition by xx order by zz desc) 사용해서 그룹별 우선순위를 하나씩 꺼낸 후에 조인하는 방법 밖에 생각이 안나네요.


    1
  • 스톡허
    303
    2019-01-11 07:15:17

    B 데이터에 시점과 그룹 그리고 id가 있는거죠? 그리고 해당 그룹별로 최대값을 찾는거구요? 

    위에 분과 같은 내용이지만, 자세하게 설명해봤습니다. 이렇게 되면 해당 그룹별 최신 데이터가 모두 나오고, 

    조인 시키시면 되겠죠.. 


    SELECT *
    FROM (
    SELECT A.*  
         , RANK(OVER PARTITION BY #GROUP_COLUMN# ORDER BY #DATE_COLUMN# DESC) RK
      FROM B_TABLE
    ) 
    WHERE RK = 1 
       


    1
  • 로그인을 하시면 답변을 등록할 수 있습니다.