| 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;
저는 2번 보다는 3번이 더 나은 듯 합니다.
한방쿼리가 아니어도 된다면 1번도 좋습니다.
* 보다는 time 만 명시해 주는게 좋을 듯 합니다.
time 에는 인덱스가 있어야 좋습니다.
감사합니다. 참고하겠습니다.