특정 값을 찾아서 조회 조건으로 처리하는 방법 0 2 3,096

by alues [SQL Query] [2024.01.18 22:06:40]


time value
2024-01-18 21:43:11 0
2024-01-18 21:43:12 1
2024-01-18 21:43:13 0
2024-01-18 21:43:14 1
2024-01-18 21:43:15 0
2024-01-18 21:43:16 0
2024-01-18 21:43:17 0
2024-01-18 21:43:18 1
2024-01-18 21:43:19 1
2024-01-18 21:43:20 1

안녕하세요.

이렇게 발생하는 데이터가 있습니다. 마지막 값이 1인 시간은 저장하고 있는 상태입니다.

해당 값은 2024-01-18 21:43:14로 가정하겠습니다.

1. 2024-01-18 21:43:14 이후에 최초 발생한 0의 위치를 가져옵니다.

2. 1번에서 가져온 2024-01-18 21:43:15 이후에 최초 발생한 1의 위치를 가져옵니다.

3. 결과는 1번의 시간, 2번의 시간이 필요합니다.

단순하게 쿼리를 두번 조회하면 되지만 한 번에 처리하는 방법이 있을 것 같아서 질문 드립니다.

2번 방법이 맞는 것 같고 3번은 데이터가 많으면 문제가 되지 않을까 생각이 듭니다.

샘플 코드는 Mariadb로 작성하였지만 적용을 하려는 곳은 RTDB 기반으로 제공해주는 라이브러리를 통해서만 쿼리를 할 수 있습니다.

with, outer join, 함수 등을 사용할 수 없게 되어 있습니다.

단순한 쿼리(?) 로만 처리하는 방법과 함수 등 어떠한 방법을 써도 되는 쿼리 2가지가 궁금합니다.

미리 감사드립니다.

-- 방법 1
select * 
  from test1 a
 where a.time > '2024-01-18 21:43:14' 
   and a.value = 0
 order by a.time  
 limit 1;
 
select * 
  from test1 a
 where a.time > '2024-01-18 21:43:15.000' 
   and a.value = 1
 order by a.time  
 limit 1;
 
 -- 방법 2
 select *, (select time from test1 where time > '2024-01-18 21:43:14' and value = 0 order by time limit 1) 
  from test1 a
 where a.time > (select time from test1 where time > '2024-01-18 21:43:14' and value = 0 order by time limit 1) 
   and a.value = 1
 order by a.time  
 limit 1;

 -- 방법 3
 select * 
  from test1 a
     , (select time from test1 where time > '2024-01-18 21:43:14' and value = 0 order by time limit 1) b
 where a.time > b.time 
   and a.value = 1
 order by a.time  
 limit 1;

 

by 마농 [2024.01.19 09:09:52]

저는 2번 보다는 3번이 더 나은 듯 합니다.
한방쿼리가 아니어도 된다면 1번도 좋습니다.
* 보다는 time 만 명시해 주는게 좋을 듯 합니다.
time 에는 인덱스가 있어야 좋습니다.


by alues [2024.01.19 20:19:50]

감사합니다. 참고하겠습니다.

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