SQL 질문입니다 0 2 424

by 묵향 [SQL Query] [2019.06.13 10:46:53]


A 테이블은 ID 1~30 까지 행이 있습니다.

B 테이블은 데이터가 없을 수도 있고 아니면 A행만큼 데이터가 있습니다.

두개를 조인해서 데이터를 가져오는데 딱 9개 행만 가져오고 싶습니다.

B 테이블에 데이터가 없을 시

ID 시간 B 테이블마지막행 표시
1      
2      
3      
4      
5      
6      
7      
8      
9      

위와같이 순번으로만 조회되어 9개를 뽑아옵니다

B 테이블에 데이터가 10개 미만으로 있을 시

ID 시간 B 테이블마지막행 표시
2 10 08:00  
5 13 08:10 O
1      
3      
4      
6      
7      
8      
9      

위와 같이 B행에 값이 있는 기준으로 먼저 정렬되어 데이터를 가져오고 나머지를 A행 ID 순번으로 채웁니다.

시간 상 제일 마지막에 들어온 값은 표시를 해둡니다.

 

B 테이블의 값이 10개 이상일 경우

ID 시간 B 테이블마지막행 표시
24 10 09:00  
20 13 09:10 O
11 11 09:12  
25 13 09:13  
23 12 09:15  
21 12 09:28  
26 13 09:30  
28 10 09:30  
29 11 09:30 O

위와 같이 시간순으로 마지막 9개만 표현을 하고 마지막 3개의 시간이 같을 경우 순번이 큰 값 한개만

마지막행 표시 컬럼에 O 표시를 해서 가져오고 싶습니다.

 

 

 

 

by 마농 [2019.06.13 13:53:11]
WITH t_a AS
(
SELECT LEVEL id
  FROM dual
 CONNECT BY LEVEL <= 31
)
, t_b AS
(
SELECT 2 id, 10 v, '08:00' tm FROM dual
UNION ALL SELECT  5, 13, '08:10' FROM dual
--UNION ALL SELECT 11, 11, '09:12' FROM dual
--UNION ALL SELECT 20, 13, '09:10' FROM dual
--UNION ALL SELECT 21, 12, '09:28' FROM dual
--UNION ALL SELECT 23, 12, '09:15' FROM dual
--UNION ALL SELECT 24, 10, '09:00' FROM dual
--UNION ALL SELECT 25, 13, '09:13' FROM dual
--UNION ALL SELECT 26, 13, '09:30' FROM dual
--UNION ALL SELECT 28, 10, '09:30' FROM dual
--UNION ALL SELECT 29, 11, '09:30' FROM dual
)
SELECT id
     , v
     , tm
     , DECODE(ROWNUM, 1, 'O') last_flag
  FROM (SELECT a.id
             , b.v
             , b.tm
          FROM t_a a
             , t_b b
         WHERE a.id = b.id(+)
         ORDER BY b.tm DESC NULLS LAST
             , NVL2(b.id, -a.id, a.id)
        )
 WHERE ROWNUM <= 9
 ORDER BY tm, id
;

 


by 묵향 [2019.06.13 16:17:17]

마농님 감사합니다 딱 원하던대로 나오네요

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입