2017-10-23 1 views
0

촛대 차트 데이터 작업 중입니다. 나는특정 시간 동안 촛대 데이터 선택 (최대, 최소, 최대, 닫음)

created     value 
2017-09-25 17:55:04 3322.09 
2017-09-25 18:00:03 3317.49 
2017-09-25 18:05:02 3316.12 
2017-09-25 18:10:03 3325.16 
2017-09-25 18:15:04 3326.01 
2017-09-25 18:20:03 3330.49 
2017-09-25 18:25:04 3331.49 
2017-09-25 18:30:04 3335.24 
2017-09-25 18:35:03 3347.13 
2017-09-25 18:40:03 3343.21 
2017-09-25 18:45:05 3341.78 
2017-09-25 18:50:03 3339.64 
2017-09-25 18:55:04 3336.12 
2017-09-25 19:00:04 3327.73 
2017-09-25 19:05:03 3327.96 
2017-09-25 19:10:04 3325.93 

와 데이터베이스 테이블 (MySQL의)을 가지고 있고 (예를 들면 15 분마다 4 시간마다 육일 시간의 기간 동안 최대, 최소, 개방 값, 가까운 값을 선택하려고 해요 등)

지금까지 내가 너무 복잡

SELECT p.created, HOUR(`DATE`), MAX(p.value), MIN(p.value) 
FROM price 
GROUP BY DATE(`DATE`),HOUR(`DATE`) 

하지 않았습니다. 그것은 매시간부터 최대 및 최소를 제공하므로 일, 주, 월과 같은 "전체"기간 및 분에 대해서는 MONTH, DAY 등의 함수를 사용할 수 있습니다.

언제든지 검색어를 작성하는 방법에 대해 알고 싶습니다. 28 분 또는 31 시간 등을 들려줍니다. 또한,이 최대 및 최소 작동하지만 시간 값 및 닫기 값 (마지막)에 대한 개방 값 (첫 번째) 필요합니다.

+0

시간의 시작 및 종료 값을 얻는 방법은 https://stackoverflow.com/questions/7745609/sql-select-only-rows-with-max-value-on-a-column?rq=1을 참조하십시오. 미문. – Barmar

+0

특정 기간을 얻으려면'어디에서 BETWEEN start_time AND end_time을 만들었습니까? ' – Barmar

+0

@Barmar - 아니요, BETWEEN을 사용하지 마십시오. 특히 1 초 미만의 정밀도를 갖는 타임 스탬프가 있기 때문에 의도하지 않은 것이 발생하기 전에 배타적 인 상한값 ('<')을 사용하는 것이 좋습니다. –

답변

0

임의의 시간 간격으로 그룹화하려면 created 열의 UNIX 시간 값 (즉, UNIX 신기원 이후의 시간)을 가져 와서 원하는 기간의 크기로 나누고 정수 부분 만 취합니다. 결과적인 몫 (및 나머지를 버린다). 그래서, 모든 28분 그룹 :

SELECT FROM_UNIXTIME(28*60 * (UNIX_TIMESTAMP(created) DIV (28*60))) grp_id 
     MIN(value) min_value, 
     MAX(value) max_value, 
     MIN(created) min_created, 
     MAX(created) max_created 
FROM  price 
GROUP BY grp_id 

당신은 내가 또한 각 그룹의 첫 번째와 마지막 값의 배를 생산하는 min_createdmax_created을 선택했는지 알 수 있습니다.

SELECT t.grp_id, 
     t.min_value, 
     t.max_value, 
     price_min.value first_value, 
     price_max.value last_value 
FROM (
    SELECT FROM_UNIXTIME(28*60 * (UNIX_TIMESTAMP(created) DIV (28*60))) grp_id 
      MIN(value) min_value, 
      MAX(value) max_value, 
      MIN(created) min_created, 
      MAX(created) max_created 
    FROM  price 
    GROUP BY grp_id 
) t JOIN price price_min ON price_min.created = t.min_created 
    JOIN price price_max ON price_max.created = t.max_created 

sqlfiddle에 그것을 참조 : 그러면 (이 본질적으로 "groupwise maximum/minimum"문제의 인스턴스) 관련 기록의 value의를 얻기 위해 다시 돌아 price 테이블에 결과를 가입 할 수 있습니다.

+0

: winces : ouch. 너를위한 색인이 없어, 돌아와, 1 년. –

+0

@ Clockwork-Muse : 데이터 세트의 크기에 따라 다릅니다. 필요한 경우 인덱스 된 열에'grp_id'를 캐시하십시오. – eggyal

+0

무엇? 음 .. 아니야. 그것은 그룹이 안정적이라고 생각할 것 같아서, 나는 적어도 두 가지가 이미 언급되었다고 생각합니다. 나는 오히려 joinable, indexable criteria를 얻는 일반적인 문제를 해결할 것이다. –

관련 문제