특정 시간에 유사한 시간값을 갖는 Row 구하기? 0 5 1,443

by playlyun [SQL Query] Query time [2018.02.20 18:01:07]


msec까지 저장되는 timestamp 컬럼이 었고요.

특정 시간 ex) '2018-02-20 18:00.00.152' 에  근접한 로우 1개, 혹은 2~3개를 가져오고 싶습니다.

 

어떤식으로 접근해야할까요?

by 마농 [2018.02.20 18:26:13]

해당 항목에 인덱스는 있나요?
입력 빈도는 어느정도 인가요?
시간 조건 외에 다른 조건은 없나요?
요구 조건이 애매한 이유는 뭔가요? (1건? 2건? 3건?)


by playlyun [2018.02.21 09:05:56]

해당 항목에 인덱스는 있나요?
- 대상 테이블에 인덱스는 장비아이디와 timestamp PK로 되있습니다.


입력 빈도는 어느정도 인가요?
 - 장비별 약 1초입니다.
시간 조건 외에 다른 조건은 없나요?
 - 장비아이디가 있습니다.


by 마농 [2018.02.21 09:19:31]
SELECT *
  FROM (SELECT tm
             , ROW_NUMBER() OVER(ORDER BY x, tm) rn
          FROM (SELECT /*+ INDEX_DESC(t pk_t) */ tm
                     , TO_TIMESTAMP(:v_tm, 'yyyy-mm-dd hh24:mi:ss.ff') - tm x
                  FROM t
                 WHERE id = :v_id
                   AND tm <= TO_TIMESTAMP(:v_tm, 'yyyy-mm-dd hh24:mi:ss.ff')
                   AND ROWNUM <= 3
                 UNION ALL
                SELECT /*+ INDEX(t pk_t) */ tm
                     , tm - TO_TIMESTAMP(:v_tm, 'yyyy-mm-dd hh24:mi:ss.ff') x
                  FROM t
                 WHERE id = :v_id
                   AND tm > TO_TIMESTAMP(:v_tm, 'yyyy-mm-dd hh24:mi:ss.ff')
                   AND ROWNUM <= 3
                )
        )
 WHERE rn <= 3
;

 


by playlyun [2018.02.22 08:47:32]

흐... 잘모르겠네요.

일단 힌트를 쓰는게 중요한가요? 제가 쓰는 디비가 PostgreSQL이라..


by 마농 [2018.02.22 14:46:20]
SELECT *
  FROM (SELECT tm
             , ROW_NUMBER() OVER(ORDER BY x, tm) rn
          FROM (SELECT *
                  FROM (SELECT tm
                             , TO_TIMESTAMP(:v_tm, 'yyyy-mm-dd hh24:mi:ss.ff') - tm x
                             , ROW_NUMBER() OVER(ORDER BY tm DESC) rn
                          FROM t
                         WHERE id = :v_id
                           AND tm <= TO_TIMESTAMP(:v_tm, 'yyyy-mm-dd hh24:mi:ss.ff')
                        ) a
                 WHERE rn <= 3
                 UNION ALL
                SELECT *
                  FROM (SELECT tm
                             , tm - TO_TIMESTAMP(:v_tm, 'yyyy-mm-dd hh24:mi:ss.ff') x
                             , ROW_NUMBER() OVER(ORDER BY tm) rn
                          FROM t
                         WHERE id = :v_id
                           AND tm > TO_TIMESTAMP(:v_tm, 'yyyy-mm-dd hh24:mi:ss.ff')
                        ) a
                 WHERE rn <= 3
                ) a
        ) a
 WHERE rn <= 3
;

 

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